From eb2567daa95662926e6e86c9c795f02ba742f948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Thu, 16 Nov 2023 21:15:05 -0500 Subject: [PATCH 01/82] test-document-fuse: Make the pyton test use less globals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - It was using the global portal inconsistently. Signed-off-by: Hubert Figuière --- tests/test-document-fuse.py | 58 ++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/test-document-fuse.py b/tests/test-document-fuse.py index 8a4678cf6..ea131df1b 100755 --- a/tests/test-document-fuse.py +++ b/tests/test-document-fuse.py @@ -253,9 +253,9 @@ def is_writable_by(self, app_id): def get_doc_path(self, app_id): if app_id: - base = portal.app_path(app_id) + "/" + self.id + base = self.portal.app_path(app_id) + "/" + self.id else: - base = portal.mountpoint + "/" + self.id + base = self.portal.mountpoint + "/" + self.id if self.is_dir: return base + "/" + self.dirname else: @@ -402,10 +402,10 @@ def ensure_app_id(self, app_id, volatile=False): self.volatile_apps.add(app_id) def get_docs(self): - return list(portal.docs.values()) + return list(self.docs.values()) def get_docs_randomized(self): - docs = list(portal.docs.values()) + docs = list(self.docs.values()) random.shuffle(docs) return docs @@ -424,10 +424,10 @@ def get_app_ids_randomized(self): return apps def by_app_path(self): - return portal.mountpoint + "/by-app" + return self.mountpoint + "/by-app" def app_path(self, app_id): - return portal.mountpoint + "/by-app/" + app_id + return self.mountpoint + "/by-app/" + app_id def check_virtual_stat(info, writable=False): @@ -510,7 +510,7 @@ def verify_doc(doc, app_id=None): assert not real_file.startswith(".xdp") -def verify_fs_layout(): +def verify_fs_layout(portal): verify_virtual_dir(portal.mountpoint, ["by-app"] + list(portal.docs.keys())) verify_virtual_dir( portal.by_app_path(), portal.get_app_ids(), portal.get_volatile_app_ids() @@ -812,7 +812,7 @@ def check_directory_doc_perms(doc, app_id): os.rename(filepath2, docpath + "/moved") assertFileHasContent(docpath + "/moved", "replaced") - assertRaisesErrno(errno.EXDEV, os.rename, docpath, portal.mountpoint) + assertRaisesErrno(errno.EXDEV, os.rename, docpath, doc.portal.mountpoint) os.unlink(docpath + "/moved") @@ -879,7 +879,7 @@ def check_doc_perms(doc, app_id): check_regular_doc_perms(doc, app_id) -def check_perms(): +def check_perms(portal): check_root_perms(portal.mountpoint) check_byapp_perms(portal.by_app_path()) @@ -890,7 +890,7 @@ def check_perms(): # Ensure that a single lookup by app-id creates that app id (we need this for when mounting the subdir for an app) -def create_app_by_lookup(): +def create_app_by_lookup(portal): # Should only work for valid app ids assertRaises(FileNotFoundError, os.lstat, portal.app_path("not-an-app-id")) @@ -917,7 +917,7 @@ def ensure_real_dir_file(create_file): return path -def export_a_doc(): +def export_a_doc(portal): path = ensure_real_dir_file(True) doc = portal.add(path) logv("exported %s as %s" % (path, doc)) @@ -946,7 +946,7 @@ def export_a_doc(): os.unlink(tmppath) -def export_a_named_doc(create_file): +def export_a_named_doc(portal, create_file): path = ensure_real_dir_file(create_file) doc = portal.add_named(path) logv("exported (named) %s as %s" % (path, doc)) @@ -962,7 +962,7 @@ def export_a_named_doc(create_file): assert doc is not not_reused_doc -def export_a_dir_doc(): +def export_a_dir_doc(portal): (dir, count) = ensure_real_dir(False) doc = portal.add_dir(dir) logv("exported (dir) %s as %s" % (dir, doc)) @@ -1001,7 +1001,7 @@ def export_a_dir_doc(): os.rmdir(subpath) -def add_an_app(num_docs): +def add_an_app(portal, num_docs): if num_docs == 0: return count = get_a_count("app") @@ -1027,41 +1027,41 @@ def add_an_app(num_docs): try: log("Connecting to portal") - portal = DocPortal() + doc_portal = DocPortal() log("Running fuse tests...") - create_app_by_lookup() - verify_fs_layout() + create_app_by_lookup(doc_portal) + verify_fs_layout(doc_portal) log("Creating some docs") for i in range(10): - export_a_doc() - verify_fs_layout() + export_a_doc(doc_portal) + verify_fs_layout(doc_portal) log("Creating some named docs (existing)") for i in range(10): - export_a_named_doc(True) - verify_fs_layout() + export_a_named_doc(doc_portal, True) + verify_fs_layout(doc_portal) log("Creating some named docs (non-existing)") for i in range(10): - export_a_named_doc(False) - verify_fs_layout() + export_a_named_doc(doc_portal, False) + verify_fs_layout(doc_portal) log("Creating some dir docs") for i in range(10): - export_a_dir_doc() - verify_fs_layout() + export_a_dir_doc(doc_portal) + verify_fs_layout(doc_portal) log("Creating some apps") for i in range(10): - add_an_app(6) - verify_fs_layout() + add_an_app(doc_portal, 6) + verify_fs_layout(doc_portal) for i in range(args.iterations): log("Checking permissions, pass %d" % (i + 1)) - check_perms() - verify_fs_layout() + check_perms(doc_portal) + verify_fs_layout(doc_portal) log("fuse tests ok") sys.exit(0) From 27fc88192d22ae4c3c99344a5c089847fdfcb9ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Fri, 17 Nov 2023 22:40:43 -0500 Subject: [PATCH 02/82] test-document-fuse: Added license header MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hubert Figuière --- tests/test-document-fuse.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/test-document-fuse.py b/tests/test-document-fuse.py index ea131df1b..b04afe12a 100755 --- a/tests/test-document-fuse.py +++ b/tests/test-document-fuse.py @@ -1,5 +1,25 @@ #!/usr/bin/env python3 +# Copyright © 2020 Red Hat, Inc +# Copyright © 2023 GNOME Foundation Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +# +# Authors: +# Alexander Larsson +# Hubert Figuière + import argparse import errno import os From 10ceedfe13e9d5fd45b48a908cd486083d7615cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Fri, 17 Nov 2023 22:41:30 -0500 Subject: [PATCH 03/82] test-document-fuse: Added FileTransfer tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hubert Figuière --- tests/test-document-fuse.py | 129 ++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/tests/test-document-fuse.py b/tests/test-document-fuse.py index b04afe12a..c1c458a3f 100755 --- a/tests/test-document-fuse.py +++ b/tests/test-document-fuse.py @@ -146,6 +146,33 @@ def assertRaisesErrno(error_nr, func, *args, **kwargs): ) +def assertRaisesGError(message, code, func, *args, **kwargs): + raised_exc = None + raised_exc_value = None + try: + func(*args, **kwargs) + except: + raised_exc = sys.exc_info()[0] + raised_exc_value = sys.exc_info()[1] + + if not raised_exc: + raise AssertionError("No assertion was raised") + if raised_exc != GLib.GError: + raise AssertionError("GError was not raised") + if not raised_exc_value.message.startswith(message): + raise AssertionError( + "Wrong message {0} doesn't start with {1}".format( + raised_exc_value.message, message + ) + ) + if raised_exc_value.code != code: + raise AssertionError( + "Wrong code {0} was raised instead of {1}".format( + raised_exc_value.code, code + ) + ) + + def assertFileHasContent(path, expected_content): with open(path) as f: file_content = f.read() @@ -449,6 +476,61 @@ def by_app_path(self): def app_path(self, app_id): return self.mountpoint + "/by-app/" + app_id +class FileTransferPortal(DocPortal): + def __init__(self): + super().__init__() + self.ft_proxy = Gio.DBusProxy.new_sync( + self.bus, + Gio.DBusProxyFlags.NONE, + None, + "org.freedesktop.portal.Documents", + "/org/freedesktop/portal/documents", + "org.freedesktop.portal.FileTransfer", + None, + ) + + def start_transfer(self): + res = self.ft_proxy.call_sync("StartTransfer", GLib.Variant("(a{sv})", ([None])), 0, -1, None) + return res[0] + + def add_files(self, key, files): + fdlist = Gio.UnixFDList.new() + handles = [] + for filename in files: + fd = os.open(filename, os.O_PATH) + handle = fdlist.append(fd) + handles.append(handle) + os.close(fd) + + res = self.ft_proxy.call_with_unix_fd_list_sync( + "AddFiles", + GLib.Variant("(saha{sv})", (key, handles, [])), + 0, + -1, + fdlist, + None, + ) + return res + + def retrieve_files(self, key): + res = self.ft_proxy.call_sync( + "RetrieveFiles", + GLib.Variant("(sa{sv})", (key, [])), + 0, + -1, + None, + ) + return res + + def stop_transfer(self, key): + res = self.ft_proxy.call_sync( + "StopTransfer", + GLib.Variant("(s)", (key,)), + 0, + -1, + None, + ) + return res def check_virtual_stat(info, writable=False): assert info.st_uid == os.getuid() @@ -1045,6 +1127,51 @@ def add_an_app(portal, num_docs): doc.apps.append(write_app) logv("granted acces to %s and %s for %s" % (read_app, write_app, ids)) +def file_transfer_portal_test(): + log("File transfer tests") + ft_portal = FileTransferPortal() + + key = ft_portal.start_transfer() + + file1 = ensure_real_dir_file(True) + file2 = ensure_real_dir_file(True) + res = ft_portal.add_files(key, [file1, file2]) + + res = ft_portal.retrieve_files(key) + files = res[0] + assert len(files) == 2 + # This is the same app, it's not sandboxed + assert files[0] == file1 + assert files[1] == file2 + log("filetransfer tests ok") + + log("filetransfer dir") + # File transfer doesn't support lists with directories. + # See https://github.com/flatpak/xdg-desktop-portal/issues/911 + dir1 = ensure_real_dir(True) + assertRaisesGError("GDBus.Error:org.freedesktop.DBus.Error.AccessDenied", 9, ft_portal.add_files, key, [file1, file2, dir1[0]]) + assertRaisesGError("GDBus.Error:org.freedesktop.DBus.Error.AccessDenied", 9, ft_portal.retrieve_files, key) + log("filetransfer dir ok") + + log("filetransfer key") + # Test that an invalid key is rejected + assert key != "1234" + assertRaisesGError("GDBus.Error:org.freedesktop.DBus.Error.AccessDenied", 9, ft_portal.add_files, "1234", [file1, file2]) + + # Test stop transfer + key = ft_portal.start_transfer() + ft_portal.add_files(key, [file1, file2]) + ft_portal.stop_transfer(key) + assertRaisesGError("GDBus.Error:org.freedesktop.DBus.Error.AccessDenied", 9, ft_portal.add_files, key, [file1, file2]) + + # Test that we can't reuse an old key + new_key = ft_portal.start_transfer() + assertRaisesGError("GDBus.Error:org.freedesktop.DBus.Error.AccessDenied", 9, ft_portal.add_files, key, [file1, file2]) + res = ft_portal.add_files(new_key, [file1, file2]) + log("filetransfer key ok") + + log("File transfer tests ok") + try: log("Connecting to portal") doc_portal = DocPortal() @@ -1084,6 +1211,8 @@ def add_an_app(portal, num_docs): verify_fs_layout(doc_portal) log("fuse tests ok") + file_transfer_portal_test() + sys.exit(0) except Exception as e: log("fuse tests failed: %s" % e) From afddebed3aced4cbfe29ba522eb03bfeda970148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Sun, 19 Nov 2023 09:48:10 -0500 Subject: [PATCH 04/82] test-document-fuse: Fix test with invalid keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - We need to start a new file transfer - This was hiding legitimate failures Signed-off-by: Hubert Figuière --- tests/test-document-fuse.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/test-document-fuse.py b/tests/test-document-fuse.py index c1c458a3f..a4d5d5420 100755 --- a/tests/test-document-fuse.py +++ b/tests/test-document-fuse.py @@ -1146,15 +1146,21 @@ def file_transfer_portal_test(): log("filetransfer tests ok") log("filetransfer dir") + key = ft_portal.start_transfer() # File transfer doesn't support lists with directories. # See https://github.com/flatpak/xdg-desktop-portal/issues/911 dir1 = ensure_real_dir(True) - assertRaisesGError("GDBus.Error:org.freedesktop.DBus.Error.AccessDenied", 9, ft_portal.add_files, key, [file1, file2, dir1[0]]) - assertRaisesGError("GDBus.Error:org.freedesktop.DBus.Error.AccessDenied", 9, ft_portal.retrieve_files, key) + assertRaisesGError("GDBus.Error:org.freedesktop.portal.Error.NotAllowed", 36, ft_portal.add_files, key, [file1, dir1[0], file2]) + res = ft_portal.retrieve_files(key) + # This doesn't look right, it should be empty but is not. It just stopped + # when a directory was encountered. + assert len(res[0]) == 1 + assert res[0][0] == file1 log("filetransfer dir ok") log("filetransfer key") # Test that an invalid key is rejected + key = ft_portal.start_transfer() assert key != "1234" assertRaisesGError("GDBus.Error:org.freedesktop.DBus.Error.AccessDenied", 9, ft_portal.add_files, "1234", [file1, file2]) @@ -1162,6 +1168,7 @@ def file_transfer_portal_test(): key = ft_portal.start_transfer() ft_portal.add_files(key, [file1, file2]) ft_portal.stop_transfer(key) + assertRaisesGError("GDBus.Error:org.freedesktop.DBus.Error.AccessDenied", 9, ft_portal.retrieve_files, key) assertRaisesGError("GDBus.Error:org.freedesktop.DBus.Error.AccessDenied", 9, ft_portal.add_files, key, [file1, file2]) # Test that we can't reuse an old key From b6c28cf6a3691e5cf858e1f1a4b1b3164ba55e3e Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Thu, 28 Jul 2022 12:05:13 +1200 Subject: [PATCH 05/82] location: Use xdp_app_info_load_app_info This fixes the desktop file not matching ${app_id}.desktop. --- src/location.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/location.c b/src/location.c index 146d4dbac..cd177ec43 100644 --- a/src/location.c +++ b/src/location.c @@ -531,12 +531,10 @@ handle_start_in_thread_func (GTask *task, if (g_strcmp0 (app_id, "") != 0) { - g_autoptr(GDesktopAppInfo) info = NULL; - g_autofree gchar *id = NULL; + g_autoptr(GAppInfo) info = NULL; const gchar *name = NULL; - id = g_strconcat (app_id, ".desktop", NULL); - info = g_desktop_app_info_new (id); + info = xdp_app_info_load_app_info (request->app_info); if (info) name = g_app_info_get_display_name (G_APP_INFO (info)); @@ -545,8 +543,8 @@ handle_start_in_thread_func (GTask *task, title = g_strdup_printf (_("Give %s Access to Your Location?"), name); - if (info && g_desktop_app_info_has_key (info, "X-Geoclue-Reason")) - subtitle = g_desktop_app_info_get_string (info, "X-Geoclue-Reason"); + if (info && g_desktop_app_info_has_key (G_DESKTOP_APP_INFO (info), "X-Geoclue-Reason")) + subtitle = g_desktop_app_info_get_string (G_DESKTOP_APP_INFO (info), "X-Geoclue-Reason"); else subtitle = g_strdup_printf (_("%s wants to use your location."), name); } From 3b35fcf17f332eafebf1d722d9e4244ec9342f6e Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Thu, 28 Jul 2022 12:24:43 +1200 Subject: [PATCH 06/82] wallpaper: Use xdp_app_info_load_app_info This fixes the desktop file not matching ${app_id}.desktop. --- src/wallpaper.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/wallpaper.c b/src/wallpaper.c index a58b1b4c5..b97c97cc8 100644 --- a/src/wallpaper.c +++ b/src/wallpaper.c @@ -185,12 +185,10 @@ handle_set_wallpaper_in_thread_func (GTask *task, if (g_strcmp0 (app_id, "") != 0) { - g_autoptr(GDesktopAppInfo) info = NULL; - g_autofree gchar *id = NULL; + g_autoptr(GAppInfo) info = NULL; const gchar *name = NULL; - id = g_strconcat (app_id, ".desktop", NULL); - info = g_desktop_app_info_new (id); + info = xdp_app_info_load_app_info (request->app_info); if (info) name = g_app_info_get_display_name (G_APP_INFO (info)); From 49158afafd2870f057e50b385db67576675a136d Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Tue, 2 Aug 2022 16:59:28 +1200 Subject: [PATCH 07/82] Fix ID passed to access dialog. This was using the portal ID, which doesn't match the .desktop file name in the case of snaps. --- src/background.c | 26 ++++++++++++++------------ src/location.c | 20 ++++++++++++++------ src/wallpaper.c | 23 +++++++++++++++-------- src/xdp-utils.c | 9 +++++++++ src/xdp-utils.h | 2 ++ 5 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/background.c b/src/background.c index 688ec5c29..b10ba7d9c 100644 --- a/src/background.c +++ b/src/background.c @@ -697,7 +697,7 @@ handle_request_background_in_thread_func (GTask *task, { Request *request = (Request *)task_data; GVariant *options; - const char *app_id; + const char *id; Permission permission; const char *reason = NULL; gboolean autostart_requested = FALSE; @@ -720,18 +720,19 @@ handle_request_background_in_thread_func (GTask *task, if (activatable) autostart_flags |= AUTOSTART_FLAGS_ACTIVATABLE; - app_id = xdp_app_info_get_id (request->app_info); + id = xdp_app_info_get_id (request->app_info); if (xdp_app_info_is_host (request->app_info)) permission = PERMISSION_YES; else - permission = get_permission (app_id); + permission = get_permission (id); - g_debug ("Handle RequestBackground for '%s'", app_id); + g_debug ("Handle RequestBackground for '%s'", id); if (permission == PERMISSION_ASK) { GVariantBuilder opt_builder; + g_autofree char *app_id = NULL; g_autofree char *title = NULL; g_autofree char *subtitle = NULL; g_autofree char *body = NULL; @@ -741,17 +742,18 @@ handle_request_background_in_thread_func (GTask *task, g_autoptr(GAppInfo) info = NULL; info = xdp_app_info_load_app_info (request->app_info); + app_id = info ? xdp_get_app_id_from_desktop_id (g_app_info_get_id (info)) : g_strdup (id); - title = g_strdup_printf (_("Allow %s to run in the background?"), info ? g_app_info_get_display_name (info) : app_id); + title = g_strdup_printf (_("Allow %s to run in the background?"), info ? g_app_info_get_display_name (info) : id); if (reason) subtitle = g_strdup (reason); else if (autostart_requested) - subtitle = g_strdup_printf (_("%s requests to be started automatically and run in the background."), info ? g_app_info_get_display_name (info) : app_id); + subtitle = g_strdup_printf (_("%s requests to be started automatically and run in the background."), info ? g_app_info_get_display_name (info) : id); else - subtitle = g_strdup_printf (_("%s requests to run in the background."), info ? g_app_info_get_display_name (info) : app_id); + subtitle = g_strdup_printf (_("%s requests to run in the background."), info ? g_app_info_get_display_name (info) : id); body = g_strdup (_("The ‘run in background’ permission can be changed at any time from the application settings.")); - g_debug ("Calling backend for background access for: %s", app_id); + g_debug ("Calling backend for background access for: %s", id); g_variant_builder_init (&opt_builder, G_VARIANT_TYPE_VARDICT); g_variant_builder_add (&opt_builder, "{sv}", "deny_label", g_variant_new_string (_("Don't allow"))); @@ -779,10 +781,10 @@ handle_request_background_in_thread_func (GTask *task, { allowed = permission != PERMISSION_NO; if (permission == PERMISSION_UNSET) - set_permission (app_id, PERMISSION_YES); + set_permission (id, PERMISSION_YES); } - g_debug ("Setting autostart for %s to %s", app_id, + g_debug ("Setting autostart for %s to %s", id, allowed && autostart_requested ? "enabled" : "disabled"); autostart_enabled = FALSE; @@ -791,10 +793,10 @@ handle_request_background_in_thread_func (GTask *task, FALSE /* don't quote escape */); if (commandline == NULL) { - g_debug ("Autostart not supported for: %s", app_id); + g_debug ("Autostart not supported for: %s", id); } else if (!xdp_dbus_impl_background_call_enable_autostart_sync (background_impl, - app_id, + id, allowed && autostart_requested, (const char * const *)commandline, autostart_flags, diff --git a/src/location.c b/src/location.c index cd177ec43..0fc9df540 100644 --- a/src/location.c +++ b/src/location.c @@ -484,7 +484,7 @@ handle_start_in_thread_func (GTask *task, { Request *request = (Request *)task_data; const char *parent_window; - const char *app_id; + const char *id; gint64 last_used = 0; g_autoptr(GError) error = NULL; guint response = 2; @@ -501,7 +501,7 @@ handle_start_in_thread_func (GTask *task, parent_window = (const char *)g_object_get_data (G_OBJECT (request), "parent-window"); - app_id = xdp_app_info_get_id (request->app_info); + id = xdp_app_info_get_id (request->app_info); if (!get_location_permissions (request->app_info, &accuracy, &last_used)) { @@ -509,6 +509,7 @@ handle_start_in_thread_func (GTask *task, g_autoptr(GVariant) access_results = NULL; g_autoptr(XdpDbusImplRequest) impl_request = NULL; GVariantBuilder access_opt_builder; + g_autofree char *app_id = NULL; g_autofree char *title = NULL; g_autofree char *subtitle = NULL; const char *body; @@ -529,7 +530,7 @@ handle_start_in_thread_func (GTask *task, g_variant_builder_add (&access_opt_builder, "{sv}", "icon", g_variant_new_string ("find-location-symbolic")); - if (g_strcmp0 (app_id, "") != 0) + if (g_strcmp0 (id, "") != 0) { g_autoptr(GAppInfo) info = NULL; const gchar *name = NULL; @@ -537,9 +538,15 @@ handle_start_in_thread_func (GTask *task, info = xdp_app_info_load_app_info (request->app_info); if (info) - name = g_app_info_get_display_name (G_APP_INFO (info)); + { + name = g_app_info_get_display_name (G_APP_INFO (info)); + app_id = xdp_get_app_id_from_desktop_id (g_app_info_get_id (info)); + } else - name = app_id; + { + name = app_id; + app_id = g_strdup (id); + } title = g_strdup_printf (_("Give %s Access to Your Location?"), name); @@ -554,6 +561,7 @@ handle_start_in_thread_func (GTask *task, * apps for which an app ID can't be determined. */ g_assert (xdp_app_info_is_host (request->app_info)); + app_id = g_strdup (""); title = g_strdup (_("Grant Access to Your Location?")); subtitle = g_strdup (_("An application wants to use your location.")); } @@ -585,7 +593,7 @@ handle_start_in_thread_func (GTask *task, if (accuracy != GCLUE_ACCURACY_LEVEL_NONE) last_used = g_get_monotonic_time (); - set_location_permissions (app_id, accuracy, last_used); + set_location_permissions (id, accuracy, last_used); if (accuracy == GCLUE_ACCURACY_LEVEL_NONE) { diff --git a/src/wallpaper.c b/src/wallpaper.c index b97c97cc8..52842cc29 100644 --- a/src/wallpaper.c +++ b/src/wallpaper.c @@ -125,7 +125,7 @@ handle_set_wallpaper_in_thread_func (GTask *task, { Request *request = (Request *)task_data; const char *parent_window; - const char *app_id = xdp_app_info_get_id (request->app_info); + const char *id = xdp_app_info_get_id (request->app_info); g_autoptr(GError) error = NULL; g_autofree char *uri = NULL; GVariantBuilder opt_builder; @@ -157,7 +157,7 @@ handle_set_wallpaper_in_thread_func (GTask *task, } - permission = get_permission_sync (app_id, PERMISSION_TABLE, PERMISSION_ID); + permission = get_permission_sync (id, PERMISSION_TABLE, PERMISSION_ID); if (permission == PERMISSION_NO) { @@ -171,6 +171,7 @@ handle_set_wallpaper_in_thread_func (GTask *task, guint access_response = 2; g_autoptr(GVariant) access_results = NULL; GVariantBuilder access_opt_builder; + g_autofree gchar *app_id = NULL; g_autofree gchar *title = NULL; g_autofree gchar *subtitle = NULL; const gchar *body; @@ -183,7 +184,7 @@ handle_set_wallpaper_in_thread_func (GTask *task, g_variant_builder_add (&access_opt_builder, "{sv}", "icon", g_variant_new_string ("preferences-desktop-wallpaper-symbolic")); - if (g_strcmp0 (app_id, "") != 0) + if (g_strcmp0 (id, "") != 0) { g_autoptr(GAppInfo) info = NULL; const gchar *name = NULL; @@ -191,9 +192,15 @@ handle_set_wallpaper_in_thread_func (GTask *task, info = xdp_app_info_load_app_info (request->app_info); if (info) - name = g_app_info_get_display_name (G_APP_INFO (info)); + { + name = g_app_info_get_display_name (G_APP_INFO (info)); + app_id = xdp_get_app_id_from_desktop_id (g_app_info_get_id (info)); + } else - name = app_id; + { + name = id; + app_id = g_strdup (id); + } title = g_strdup_printf (_("Allow %s to Set Backgrounds?"), name); subtitle = g_strdup_printf (_("%s is requesting to be able to change the background image."), name); @@ -204,10 +211,10 @@ handle_set_wallpaper_in_thread_func (GTask *task, * apps for which an app ID can't be determined. */ g_assert (xdp_app_info_is_host (request->app_info)); + app_id = g_strdup (""); title = g_strdup (_("Allow Applications to Set Backgrounds?")); subtitle = g_strdup (_("An application is requesting to be able to change the background image.")); } - body = _("This permission can be changed at any time from the privacy settings."); if (!xdp_dbus_impl_access_call_access_dialog_sync (access_impl, @@ -229,7 +236,7 @@ handle_set_wallpaper_in_thread_func (GTask *task, } if (permission == PERMISSION_UNSET) - set_permission_sync (app_id, PERMISSION_TABLE, PERMISSION_ID, access_response == 0 ? PERMISSION_YES : PERMISSION_NO); + set_permission_sync (id, PERMISSION_TABLE, PERMISSION_ID, access_response == 0 ? PERMISSION_YES : PERMISSION_NO); if (access_response != 0) { @@ -288,7 +295,7 @@ handle_set_wallpaper_in_thread_func (GTask *task, g_debug ("Calling SetWallpaperURI with %s", uri); xdp_dbus_impl_wallpaper_call_set_wallpaper_uri (impl, request->id, - app_id, + id, parent_window, uri, g_variant_builder_end (&opt_builder), diff --git a/src/xdp-utils.c b/src/xdp-utils.c index 94cd46b45..736e57c09 100644 --- a/src/xdp-utils.c +++ b/src/xdp-utils.c @@ -1418,6 +1418,15 @@ xdp_is_valid_app_id (const char *string) return TRUE; } +char * +xdp_get_app_id_from_desktop_id (const char *desktop_id) +{ + const gchar *suffix = ".desktop"; + if (g_str_has_suffix (desktop_id, suffix)) + return g_strndup (desktop_id, strlen (desktop_id) - strlen (suffix)); + else + return g_strdup (desktop_id); +} char * xdp_quote_argv (const char *argv[]) diff --git a/src/xdp-utils.h b/src/xdp-utils.h index 65e9410b6..c92eea0a8 100644 --- a/src/xdp-utils.h +++ b/src/xdp-utils.h @@ -60,6 +60,8 @@ gint xdp_mkstempat (int dir_fd, gboolean xdp_is_valid_app_id (const char *string); +char *xdp_get_app_id_from_desktop_id (const char *desktop_id); + gboolean xdp_validate_serialized_icon (GVariant *v, gboolean bytes_only, char **out_format, From b817569628570a98a3731dff7898e196b98c270a Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Wed, 3 Aug 2022 10:23:58 +1200 Subject: [PATCH 08/82] Use new helper function --- src/open-uri.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/open-uri.c b/src/open-uri.c index a5449d06e..52202ac96 100644 --- a/src/open-uri.c +++ b/src/open-uri.c @@ -213,7 +213,7 @@ get_app_id (GAppInfo *info) desktop_id = g_app_info_get_id (info); - return g_strndup (desktop_id, strlen (desktop_id) - strlen (".desktop")); + return xdp_get_app_id_from_desktop_id (desktop_id); } static gboolean From 5c5ba4cfb61ea7537dd4b9a2d60942d7ceb56753 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 24 Aug 2023 17:42:50 +0100 Subject: [PATCH 09/82] Port the docs to Sphinx Docbook is a barrier to contribution, and the generated output isn't the most appealing. Luckily for us, there are better documentation generators, these days, and they don't all use XML; one of these generators is Sphinx, which is commonly used by communities like Python, by projects like GCC, the Linux kernel, and GNOME. Sphinx uses reStructuredText, which is a well-specified plain text format. The gdbus-codegen tool already supports generating reStructuredText from the XML introspection of the D-Bus interfaces. --- doc/common-conventions.rst | 63 ++++++++++ doc/conf.py | 28 +++++ doc/docbook.css | 105 ----------------- doc/implementation-interfaces.rst | 42 +++++++ doc/index.rst | 31 +++++ doc/meson.build | 95 ++++++++------- doc/portal-docs.xml.in | 188 ------------------------------ doc/portal-interfaces.rst | 44 +++++++ doc/xmlto-config.xsl | 13 --- meson.build | 13 ++- meson_options.txt | 8 +- 11 files changed, 271 insertions(+), 359 deletions(-) create mode 100644 doc/common-conventions.rst create mode 100644 doc/conf.py delete mode 100644 doc/docbook.css create mode 100644 doc/implementation-interfaces.rst create mode 100644 doc/index.rst delete mode 100644 doc/portal-docs.xml.in create mode 100644 doc/portal-interfaces.rst delete mode 100644 doc/xmlto-config.xsl diff --git a/doc/common-conventions.rst b/doc/common-conventions.rst new file mode 100644 index 000000000..a7c46d2d8 --- /dev/null +++ b/doc/common-conventions.rst @@ -0,0 +1,63 @@ +Common Conventions +================== + +Requests made via portal interfaces generally involve user interaction, and +dialogs that can stay open for a long time. Therefore portal APIs don't just use +async method calls (which time out after at most 25 seconds), but instead return +results via a Response signal on Request objects. + +Portal APIs don't use properties very much. This is partially because we need to +be careful about the flow of information, and partially because it would be +unexpected to have a dialog appear when you just set a property. However, every +portal has at least one version property that specifies the maximum version +supported by xdg-desktop-portal. + +Portal requests +--------------- + +The general flow of the portal API is that the application makes a portal +request, the portal replies to that method call with a handle (i.e. object path) +to a Request object that corresponds to the request. The object is exported on +the bus and stays alive as long as the user interaction lasts. When the user +interaction is over, the portal sends a Response signal back to the application +with the results from the interaction, if any. + +To avoid a race condition between the caller subscribing to the signal after +receiving the reply for the method call and the signal getting emitted, a +convention for Request object paths has been established that allows the caller +to subscribe to the signal before making the method call. + +Sessions +-------- + +Some portal requests are connected to each other and need to be used in +sequence. The pattern we use in such cases is a Session object. Just like +Requests, Sessions are represented by an object path, that is returned by the +initial CreateSession call of the respective portal. Subsequent calls take the +object path of the session they operate on as an argument. + +Sessions can be ended from the application side by calling the Close() method on +the session. They can also be closed from the service side, in which case the +::Closed signal is emitted on the Session object to inform the application. + +Parent window identifiers +------------------------- + +Most portals interact with the user by showing dialogs. These dialogs should +generally be placed on top of the application window that triggered them. To +arrange this, the compositor needs to know about the application window. Many +portal requests expect a "parent_window" string argument for this reason. + +Under X11, the "parent_window" argument should have the form "x11:XID", where +XID is the XID of the application window in hexadecimal notation. + +Under Wayland, it should have the form "wayland:HANDLE", where HANDLE is a +surface handle obtained with the `xdg_foreign +`_ +protocol. + +For other windowing systems, or if you don't have a suitable handle, just pass +an empty string for "parent_window". + +.. toctree:: + :maxdepth: 2 diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 000000000..a5848a4cb --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,28 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'XDG Desktop Portals' +copyright = '2023, XDG Desktop Portal Authors' +author = 'XDG Desktop Portal Authors' +release = 'xdg-desktop-portal' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [] + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'sphinx_rtd_theme' +html_static_path = ['_static'] diff --git a/doc/docbook.css b/doc/docbook.css deleted file mode 100644 index a2ac431ef..000000000 --- a/doc/docbook.css +++ /dev/null @@ -1,105 +0,0 @@ -body { - font-family: sans-serif; - max-width: 850px; - margin: auto; - overflow-wrap: break-word; -} -html { - background-color: #fafafa; -} -h1.title { -} -.permission { - color: #ee0000; - text-decoration: underline; -} -.synopsis, -.classsynopsis { - background: #eeeeee; -} -.programlisting { - background: #eeeeff; -} -.synopsis, -.classsynopsis, -.programlisting { - padding: 1em; - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.03), - 0 1px 3px 1px rgba(0, 0, 0, .07), - 0 2px 6px 2px rgba(0, 0, 0, .03); - overflow: auto; - border-radius: 12px; -} -div.variablelist { - padding: 4px; - margin-left: 1em; -} -dl.variablelist td:first-child { - vertical-align: top; -} -td.shortcuts { - color: #770000; - font-size: 80%; -} -div.refnamediv { - margin-top: 2em; -} -div.toc { - border: 2em; -} -a { - text-decoration: none; -} -a:hover { - text-decoration: underline; - color: #ff0000; -} - -div.table table { - border-collapse: collapse; - border-spacing: 0px; - border-style: solid; - border-color: #777777; - border-width: 1px; -} - -div.table table td, -div.table table th { - border-style: solid; - border-color: #777777; - border-width: 1px; - padding: 3px; - vertical-align: top; -} - -div.table table th { - background-color: #eeeeee; -} - -@media (prefers-color-scheme: dark) { - html { - background-color: #242424; - color: white; - } - - a { - color: #8886fa; - } - - a:hover { - color: #5a57fa; - } - - .synopsis, - .classsynopsis, - .programlisting { - background: rgba(255, 255, 255, .08); - } -} - -@media only screen and (max-width: 900px) { - .book { - margin: 1rem; - font-size: 90% - } -} diff --git a/doc/implementation-interfaces.rst b/doc/implementation-interfaces.rst new file mode 100644 index 000000000..5cc279731 --- /dev/null +++ b/doc/implementation-interfaces.rst @@ -0,0 +1,42 @@ +D-Bus Interfaces for Portal Implementations +=========================================== + +The backend interfaces are used by the portal frontend to carry out portal +requests. They are provided by a separate process (or processes), and are not +accessible to sandboxed applications. + +The separation of the portal infrastructure into frontend and backend is a clean +way to provide suitable user interfaces that fit into different desktop +environments, while sharing the portal frontend. + +The portal backends are focused on providing user interfaces and accessing +session- or host-specific APIs and resources. Details of interacting with the +containment infrastructure such as checking access, registering files in the +document portal, etc., are handled by the portal frontend. + +.. toctree:: + :maxdepth: 1 + + doc-org.freedesktop.impl.portal.Access.rst + doc-org.freedesktop.impl.portal.Account.rst + doc-org.freedesktop.impl.portal.AppChooser.rst + doc-org.freedesktop.impl.portal.Background.rst + doc-org.freedesktop.impl.portal.Clipboard.rst + doc-org.freedesktop.impl.portal.DynamicLauncher.rst + doc-org.freedesktop.impl.portal.Email.rst + doc-org.freedesktop.impl.portal.FileChooser.rst + doc-org.freedesktop.impl.portal.GlobalShortcuts.rst + doc-org.freedesktop.impl.portal.Inhibit.rst + doc-org.freedesktop.impl.portal.InputCapture.rst + doc-org.freedesktop.impl.portal.Lockdown.rst + doc-org.freedesktop.impl.portal.Notification.rst + doc-org.freedesktop.impl.portal.PermissionStore.rst + doc-org.freedesktop.impl.portal.Print.rst + doc-org.freedesktop.impl.portal.RemoteDesktop.rst + doc-org.freedesktop.impl.portal.Request.rst + doc-org.freedesktop.impl.portal.ScreenCast.rst + doc-org.freedesktop.impl.portal.Screenshot.rst + doc-org.freedesktop.impl.portal.Secret.rst + doc-org.freedesktop.impl.portal.Session.rst + doc-org.freedesktop.impl.portal.Settings.rst + doc-org.freedesktop.impl.portal.Wallpaper.rst diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 000000000..b8d95a057 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,31 @@ +.. XDG Desktop Portals documentation master file, created by + sphinx-quickstart on Thu Aug 24 16:58:13 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to XDG Desktop Portals's documentation! +=============================================== + +.. toctree:: + :maxdepth: 1 + :caption: For portal users and integrators + + portals.conf + + +.. toctree:: + :maxdepth: 1 + :caption: For application developers + + common-conventions + portal-interfaces + + +.. toctree:: + :maxdepth: 1 + :caption: For portal developers + + implementation-interfaces + + +Welcome to the documentation for XDG Desktop Portals. diff --git a/doc/meson.build b/doc/meson.build index 97c5af643..b685bb090 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -1,42 +1,4 @@ -if build_docbook - xslfile = files('xmlto-config.xsl') - - portal_docs_xml = configure_file( - input: 'portal-docs.xml.in', - output: '@BASENAME@', - configuration: { - 'VERSION': meson.project_version(), - }, - ) - - docs = custom_target( - 'html', - build_by_default: true, - depends: [portal_built_sources, impl_built_sources], - input: portal_docs_xml, - output: 'portal-docs.html', - command: [xmlto, get_option('xmlto-flags'), 'xhtml-nochunks', - '-o', '@OUTDIR@', - '-m', xslfile, - '--searchpath', meson.project_build_root() / 'src', - '@INPUT@'], - install: true, - install_dir: docs_dir, - ) - doc_extra = files( - 'docbook.css', - 'redirect.html' - ) - foreach f : doc_extra - configure_file( - input: f, - output: '@PLAINNAME@', - copy: true, - install: true, - install_dir: docs_dir, - ) - endforeach -endif +manpages = [] if rst2man.found() manpage_conf = configuration_data() @@ -46,7 +8,7 @@ if rst2man.found() rst2man_flags = [ '--syntax-highlight=none', ] - + man_pages = [ { 'input': 'portals.conf.rst.in', 'output': 'portals.conf', 'section': '5' }, ] @@ -61,7 +23,7 @@ if rst2man.found() man_section = man_page.get('section', '1') man_full = '@0@.@1@'.format(man_output, man_section) - custom_target('man-' + man_output, + manpages += custom_target('man-' + man_output, input: man_input, output: man_full, command: [ rst2man, rst2man_flags, '@INPUT@' ], @@ -71,3 +33,54 @@ if rst2man.found() ) endforeach endif + +if build_documentation + # Gather the XML files under data + all_interfaces_xml = [] + foreach i: portal_sources + all_interfaces_xml += i + endforeach + foreach i: portal_impl_sources + all_interfaces_xml += i + endforeach + + # Replace the extension for gdbus-codegen + all_interfaces_rst = [] + foreach i: all_interfaces_xml + f = fs.name(i) + all_interfaces_rst += fs.replace_suffix(f, '.rst') + endforeach + + interfaces_rst = custom_target('interfaces_rst', + input: all_interfaces_xml, + output: all_interfaces_rst, + command: [ gdbus_codegen, '--generate-rst', 'doc/doc', '@INPUT@' ], + ) + + docs_sources = [ + 'conf.py', + + 'index.rst', + 'common-conventions.rst', + 'portal-interfaces.rst', + 'implementation-interfaces.rst', + ] + + copied_docs_sources = [] + foreach d: docs_sources + copied_docs_sources += configure_file(input: d, output: d, copy: true) + endforeach + + docs_inputs = copied_docs_sources + interfaces_rst + if rst2man.found() + docs_inputs += manpages + endif + + custom_target('docs', + input: docs_inputs, + output: 'html', + command: [ sphinx_build, meson.current_build_dir(), '@OUTPUT@' ], + build_by_default: true, + depend_files: all_interfaces_xml, + ) +endif diff --git a/doc/portal-docs.xml.in b/doc/portal-docs.xml.in deleted file mode 100644 index f83ac2f7c..000000000 --- a/doc/portal-docs.xml.in +++ /dev/null @@ -1,188 +0,0 @@ - - -]> - - - Portal Documentation - Version @VERSION@ - - - Common Conventions - - Requests made via portal interfaces generally involve user interaction, - and dialogs that can stay open for a long time. Therefore portal APIs - don't just use async method calls (which time out after at most 25 seconds), - but instead return results via a Response signal on Request objects. - - - Portal APIs don't use properties very much. This is partially because - we need to be careful about the flow of information, and partially because - it would be unexpected to have a dialog appear when you just set a property. - -
- Portal requests - - The general flow of the portal API is that the application makes - a portal request, the portal replies to that method call with a - handle (i.e. object path) to Request object that corresponds to the - request. The object is exported on the bus and stays alive as long - as the user interaction lasts. When the user interaction is over, - the portal sends a Response signal back to the application with - the results from the interaction, if any. - - - To avoid a race condition between the caller subscribing to the signal - after receiving the reply for the method call and the signal getting emitted, - a convention for Request object paths has been established that allows the - caller to subscribe to the signal before making the method call. - -
-
- Sessions - - Some portal requests are connected to each other and need to be used in - sequence. The pattern we use in such cases is a Session object. Just like - Requests, Sessions are represented by an object path, that is returned by - the initial CreateSession call. Subsequent calls take the object path of - the session they operate on as an argument. - - - Sessions can be ended from the application side by calling the Close() - method. They can also be closed from the service side, in which case the - ::Closed signal is emitted to inform the application. - -
-
- Parent window identifiers - - Most portals interact with the user by showing dialogs. These dialogs - should generally be placed on top of the application window that triggered - them. To arrange this, the compositor needs to know about the application - window. Many portal requests expect a "parent_window" string argument for - this reason. - - - Under X11, the "parent_window" argument should have the form - "x11:XID", where XID - is the XID of the application window in hexadecimal notation. - - - Under Wayland, it should have the form "wayland:HANDLE", - where HANDLE is a surface handle obtained with the - xdg_foreign protocol. - - - For other windowing systems, or if you don't have a suitable handle, just - pass an empty string for "parent_window". - -
-
- - Portal API Reference - - - Portal interfaces are available to sandboxed applications with the - default filtered session bus access of Flatpak. Unless otherwise - specified, they appear under the bus name org.freedesktop.portal.Desktop - and the object path /org/freedesktop/portal/desktop on the session - bus. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Portal Backend API Reference - - - The backend interfaces are used by the portal frontend to - carry out portal requests. They are provided by a separate process - (or processes), and are not accessible to sandboxed applications. - - - The separation of the portal infrastructure into frontend and backend - is a clean way to provide suitable user interfaces that fit into - different desktop environments, while sharing the portal frontend. - - - The portal backends are focused on providing user interfaces and - accessing session- or host-specific APIs and resources. Details of - interacting with the containment infrastructure such as checking - access, registering files in the document portal, etc., are handled - by the portal frontend. - - - - - - - - - - - - - - - - - - - - - - - - - - - Background Apps Monitoring API - - - In addition to managing the regular interfaces that sandboxed - applications use to interfact with the host system, xdg-desktop-portals - also monitors running applications without an active window - if the - portal backend provides an implementation of the Background portal. - - - This API can be used by host system services to provide rich interfaces - to manage background running applications. - - - - -
diff --git a/doc/portal-interfaces.rst b/doc/portal-interfaces.rst new file mode 100644 index 000000000..ee98f176d --- /dev/null +++ b/doc/portal-interfaces.rst @@ -0,0 +1,44 @@ +D-Bus Interfaces for Portal Users +================================= + +Portal interfaces are available to sandboxed applications with the default +filtered session bus access of Flatpak. + +Unless otherwise specified, they appear under the bus name ``org.freedesktop.portal.Desktop`` +and the object path ``/org/freedesktop/portal/desktop`` on the session bus. + +.. toctree:: + :maxdepth: 1 + + doc-org.freedesktop.portal.Account.rst + doc-org.freedesktop.portal.Background.rst + doc-org.freedesktop.portal.Camera.rst + doc-org.freedesktop.portal.Clipboard.rst + doc-org.freedesktop.portal.Device.rst + doc-org.freedesktop.portal.Documents.rst + doc-org.freedesktop.portal.DynamicLauncher.rst + doc-org.freedesktop.portal.Email.rst + doc-org.freedesktop.portal.FileChooser.rst + doc-org.freedesktop.portal.FileTransfer.rst + doc-org.freedesktop.portal.GameMode.rst + doc-org.freedesktop.portal.GlobalShortcuts.rst + doc-org.freedesktop.portal.Inhibit.rst + doc-org.freedesktop.portal.InputCapture.rst + doc-org.freedesktop.portal.Location.rst + doc-org.freedesktop.portal.MemoryMonitor.rst + doc-org.freedesktop.portal.NetworkMonitor.rst + doc-org.freedesktop.portal.Notification.rst + doc-org.freedesktop.portal.OpenURI.rst + doc-org.freedesktop.portal.PowerProfileMonitor.rst + doc-org.freedesktop.portal.Print.rst + doc-org.freedesktop.portal.ProxyResolver.rst + doc-org.freedesktop.portal.Realtime.rst + doc-org.freedesktop.portal.RemoteDesktop.rst + doc-org.freedesktop.portal.Request.rst + doc-org.freedesktop.portal.ScreenCast.rst + doc-org.freedesktop.portal.Screenshot.rst + doc-org.freedesktop.portal.Secret.rst + doc-org.freedesktop.portal.Session.rst + doc-org.freedesktop.portal.Settings.rst + doc-org.freedesktop.portal.Trash.rst + doc-org.freedesktop.portal.Wallpaper.rst diff --git a/doc/xmlto-config.xsl b/doc/xmlto-config.xsl deleted file mode 100644 index b07ef517c..000000000 --- a/doc/xmlto-config.xsl +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - diff --git a/meson.build b/meson.build index 11f670f27..05d0a5636 100644 --- a/meson.build +++ b/meson.build @@ -142,14 +142,15 @@ endif add_project_arguments(['-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_66'], language: 'c') -build_docbook = false -xmlto = find_program('xmlto', required: get_option('docbook-docs')) -if xmlto.found() +build_documentation = false +gdbus_codegen = find_program('gdbus-codegen', native: true, required: get_option('documentation')) +sphinx_build = find_program('sphinx-build', native: true, required: get_option('documentation')) +if not get_option('documentation').disabled() and gdbus_codegen.found() and sphinx_build.found() fs = import('fs') # we're going to copy this file in to our build tree if fs.is_file(flatpak_intf_dir / 'org.freedesktop.portal.Flatpak.xml') - build_docbook = true - elif get_option('docbook-docs').enabled() + build_documentation = true + elif get_option('documentation').enabled() error('Flatpak development files are required to build DocBook docs') endif endif @@ -192,7 +193,7 @@ subdir('doc') configure_file(output: 'config.h', configuration: config_h) summary({ - 'Enable docbook documentation': build_docbook, + 'Enable documentation': build_documentation, 'Enable libsystemd support': have_libsystemd, 'Enable geoclue support': have_geoclue, 'Enable libportal support': have_libportal, diff --git a/meson_options.txt b/meson_options.txt index 48920bac7..19667f542 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -26,14 +26,10 @@ option('systemd', type: 'feature', value: 'auto', description: 'Enable systemd support') -option('docbook-docs', +option('documentation', type: 'feature', value: 'auto', - description: 'Build documentation (requires xmlto)') -option('xmlto-flags', - type: 'array', - value: [], - description: 'Define/override "xmlto" options, like "--skip-validation"') + description: 'Build documentation (requires sphinx)') option('datarootdir', type: 'string', value: '', From c24a556a2537b395e1ccc1ca3226416930158638 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 24 Aug 2023 14:20:37 -0300 Subject: [PATCH 10/82] ci: Build Sphinx documentation Pass the right flags to meson --- .github/workflows/pages.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index ac155b9b9..3e4b929f5 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -53,14 +53,15 @@ jobs: apt-get install -y --no-install-recommends \ ca-certificates \ git \ - xmlto + python3-sphinx \ + python3-sphinx-rtd-theme - name: Check out xdg-desktop-portal uses: actions/checkout@v3 - name: Build docs run: | - meson setup builddir -Ddocbook-docs=enabled + meson setup builddir -Ddocumentation=enabled meson compile -C builddir - name: Build website From e98272afda1a53da2069297f6c1a196c628becc9 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 24 Aug 2023 14:38:01 -0300 Subject: [PATCH 11/82] ci: Publish doc/html to GitHub Pages We don't need to cherry-pick which files to publish anymore, so just publish the entire doc/html folder. --- .github/workflows/pages.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 3e4b929f5..f6998c289 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -73,10 +73,7 @@ jobs: - name: Prepare docs working-directory: builddir/doc run: | - mkdir ../../_site/docs/ - mv portal-docs.html ../../_site/docs/index.html - mv redirect.html ../../_site/docs/portal-docs.html - mv docbook.css ../../_site/docs/ + mv ./html ../../_site/docs - name: Upload artifact uses: actions/upload-pages-artifact@v2 From 5ac0a981d73caae985e7e3a88d454fc83515200b Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 24 Aug 2023 17:57:44 +0100 Subject: [PATCH 12/82] doc: Port Account interface XML to rST --- data/org.freedesktop.portal.Account.xml | 63 ++++++++----------------- 1 file changed, 20 insertions(+), 43 deletions(-) diff --git a/data/org.freedesktop.portal.Account.xml b/data/org.freedesktop.portal.Account.xml index c8fb98a7f..33b9a9f5a 100644 --- a/data/org.freedesktop.portal.Account.xml +++ b/data/org.freedesktop.portal.Account.xml @@ -38,51 +38,28 @@ Gets information about the user. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - reason s - - A string that can be shown in the dialog to expain why the information is needed. - This should be a complete sentence that explains what the application will do with - the returned information, for example: Allows your personal information to be included - with recipes you share with your friends. - - - + + * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``reason`` (``s``) + A string that can be shown in the dialog to explain why the information is + needed. This should be a complete sentence that explains what the application + will do with the returned information, for example: "Allows your personal + information to be included with recipes you share with your friends". The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - id s - - The user id. - - - - name s - - - The users real name. - - - - - image s - - - The uri of an image file for the users avatar photo. - - - - + + * ``id`` (``s``) + The user id. + + * ``name`` (``s``) + The user's real name. + + * ``image`` (``s``) + The URI of an image file for the user's avatar photo. --> From 79958740d72d8a424b2c4d612e55d26fa858bfbd Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 24 Aug 2023 18:19:41 +0100 Subject: [PATCH 13/82] doc: Port Background interface XML to rST --- data/org.freedesktop.portal.Background.xml | 110 +++++++-------------- 1 file changed, 38 insertions(+), 72 deletions(-) diff --git a/data/org.freedesktop.portal.Background.xml b/data/org.freedesktop.portal.Background.xml index 8ef85dcef..10a95ac52 100644 --- a/data/org.freedesktop.portal.Background.xml +++ b/data/org.freedesktop.portal.Background.xml @@ -32,70 +32,40 @@ @@ -107,22 +77,18 @@ SetStatus: @options: Vardict with optional further information + .. note:: + This method was added in version 2. + Sets the status of the application running in background. Supported keys in the @options vardict include: - - - message s - - A string that will be used as the status message of the application. - This should be a single line that can be presented to the user in a - list, not a full sentence or paragraph. Must be shorter than 96 - characters. - - - - - This method was added in version 2. + + * ``message`` (``s``) + A string that will be used as the status message of the application. + This should be a single line that can be presented to the user in a + list, not a full sentence or paragraph. Must be shorter than 96 + characters. --> From b29de6258eebbab48cdf908b131a698fb012da00 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 24 Aug 2023 14:14:11 -0300 Subject: [PATCH 14/82] doc: Port Wallpaper interface XML to rST --- data/org.freedesktop.portal.Wallpaper.xml | 46 ++++++++--------------- 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/data/org.freedesktop.portal.Wallpaper.xml b/data/org.freedesktop.portal.Wallpaper.xml index a2146904e..e01140e1e 100644 --- a/data/org.freedesktop.portal.Wallpaper.xml +++ b/data/org.freedesktop.portal.Wallpaper.xml @@ -42,21 +42,14 @@ background, use the org.freedesktop.portal.Wallpaper.SetWallpaperFile() method. Supported keys in the @options vardict include: - - - show-preview b - - whether to show a preview of the picture. Note that the portal may - decide to show a preview even if this option is not set - - - - set-on s - - where to set the wallpaper. Possible values are 'background', 'lockscreen' or 'both' - - - + + * ``show-preview`` (``b``) + Whether to show a preview of the picture. Note that the portal may + decide to show a preview even if this option is not set. + + * ``set-on`` (``s``) + Where to set the wallpaper. Possible values are ``background``, + ``lockscreen``, or ``both``. --> @@ -75,21 +68,14 @@ Asks to set a given local file as the desktop background picture. Supported keys in the @options vardict include: - - - show-preview b - - whether to show a preview of the picture. Note that the portal may - decide to show a preview even if this option is not set - - - - set-on s - - where to set the wallpaper. Possible values are 'background', 'lockscreen' or 'both' - - - + + * ``show-preview`` (``b``) + Whether to show a preview of the picture. Note that the portal may + decide to show a preview even if this option is not set. + + * ``set-on`` (``s``) + Where to set the wallpaper. Possible values are ``background``, + ``lockscreen``, or ``both``. --> From ad9a5bc56b1384d23280286aff075c3dd4d36a60 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 24 Aug 2023 15:37:49 -0300 Subject: [PATCH 15/82] doc: Port Settings interface XML to rST --- data/org.freedesktop.portal.Settings.xml | 37 +++++++++--------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/data/org.freedesktop.portal.Settings.xml b/data/org.freedesktop.portal.Settings.xml index 1ae675256..9cf5b954f 100644 --- a/data/org.freedesktop.portal.Settings.xml +++ b/data/org.freedesktop.portal.Settings.xml @@ -29,29 +29,20 @@ Currently the interface provides the following keys: - - - org.freedesktop.appearance color-scheme u - - Indicates the system's preferred color scheme. - Supported values are: - - 0: No preference - 1: Prefer dark appearance - 2: Prefer light appearance - - Unknown values should be treated as 0 (no preference). - - - - org.freedesktop.appearance accent-color (ddd) - - Indicates the system's preferred accent color as a tuple of RGB values - in the sRGB color space, in the range [0,1]. - Out-of-range RGB values should be treated as an unset accent color. - - - + * ``org.freedesktop.appearance`` ``color-scheme`` (``u``) + Indicates the system's preferred color scheme. + Supported values are: + + * ``0``: No preference + * ``1``: Prefer dark appearance + * ``2``: Prefer light appearance + + Unknown values should be treated as ``0`` (no preference). + + * ``org.freedesktop.appearance`` ``accent-color`` (``(ddd)``) + Indicates the system's preferred accent color as a tuple of RGB values in + the sRGB color space, in the range [0,1]. Out-of-range RGB values should + be treated as an unset accent color. Implementations can provide other keys; they are entirely implementation details that are undocumented. If you are a From 18d209a21fc535a915f7d5b98db972e7c29f8c9c Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 24 Aug 2023 15:41:22 -0300 Subject: [PATCH 16/82] doc: Improve Session output in rST --- data/org.freedesktop.portal.Session.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/org.freedesktop.portal.Session.xml b/data/org.freedesktop.portal.Session.xml index 8a902b2e8..74c39891c 100644 --- a/data/org.freedesktop.portal.Session.xml +++ b/data/org.freedesktop.portal.Session.xml @@ -35,11 +35,11 @@ call org.freedesktop.portal.Session.Close() depends on the interface. The handle of a session will be of the form - /org/freedesktop/portal/desktop/session/SENDER/TOKEN, where SENDER is the - callers unique name, with the initial ':' removed and all '.' replaced by - '_', and TOKEN is a unique token that the caller provided with the - session_handle_token key in the options vardict of the method creating - the session. + ``/org/freedesktop/portal/desktop/session/SENDER/TOKEN``, where ``SENDER`` + is the caller's unique name, with the initial ``:`` removed and all ``.`` + replaced by ``_``, and ``TOKEN`` is a unique token that the caller + provided with the ``session_handle_token`` key in the options vardict of + the method creating the session. The token that the caller provides should be unique and not guessable. To avoid clashes with calls made from unrelated libraries, it is a good idea From 1e8cf1c0d9818a153fd486e2089b305114d10ffa Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Fri, 25 Aug 2023 12:26:44 -0300 Subject: [PATCH 17/82] doc: Port Secret interface XML to rST --- data/org.freedesktop.portal.Secret.xml | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/data/org.freedesktop.portal.Secret.xml b/data/org.freedesktop.portal.Secret.xml index a647baf52..df293ed1c 100644 --- a/data/org.freedesktop.portal.Secret.xml +++ b/data/org.freedesktop.portal.Secret.xml @@ -59,22 +59,14 @@ a token element in @options. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - token s - - An opaque string returned by a previous org.freedesktop.portal.Secret.RetrieveSecret() call. - - - + + * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``token`` (``s``) + An opaque string returned by a previous org.freedesktop.portal.Secret.RetrieveSecret() call. --> From 1a83633c039bafe6a6e68e1c2572666417042797 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Sun, 27 Aug 2023 12:51:45 -0300 Subject: [PATCH 18/82] doc: Port Screenshot interface XML to rST --- data/org.freedesktop.portal.Screenshot.xml | 74 ++++++++-------------- 1 file changed, 26 insertions(+), 48 deletions(-) diff --git a/data/org.freedesktop.portal.Screenshot.xml b/data/org.freedesktop.portal.Screenshot.xml index f8927de65..46a2dd0fe 100644 --- a/data/org.freedesktop.portal.Screenshot.xml +++ b/data/org.freedesktop.portal.Screenshot.xml @@ -29,50 +29,36 @@ via the document portal, and the returned URI will point into the document portal fuse filesystem in /run/user/$UID/doc/. - This documentation describes version 2 of this interface. + This documentation describes **version 2** of this interface. --> @@ -88,24 +74,16 @@ Obtains the color of a single pixel. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - + + * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - color (ddd) - The color, rgb values in the range [0,1]. - - + + * ``color`` (``(ddd)``) + The color, RGB values in the range [0,1], in the sRGB color space. --> From c94f41f9a0fa01da4595499d509aaa362ef8e237 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 26 Oct 2023 22:14:01 +0100 Subject: [PATCH 19/82] docs: Port more interfaces to reStructuredText --- data/org.freedesktop.portal.Account.xml | 1 + data/org.freedesktop.portal.Background.xml | 1 + data/org.freedesktop.portal.Camera.xml | 18 +- data/org.freedesktop.portal.Clipboard.xml | 41 +- data/org.freedesktop.portal.Device.xml | 26 +- data/org.freedesktop.portal.Documents.xml | 66 ++- ...org.freedesktop.portal.DynamicLauncher.xml | 157 ++--- data/org.freedesktop.portal.Email.xml | 126 ++-- data/org.freedesktop.portal.FileChooser.xml | 559 +++++++----------- data/org.freedesktop.portal.Request.xml | 21 +- doc/index.rst | 7 + doc/meson.build | 4 + src/meson.build | 4 +- 13 files changed, 415 insertions(+), 616 deletions(-) diff --git a/data/org.freedesktop.portal.Account.xml b/data/org.freedesktop.portal.Account.xml index 33b9a9f5a..c67fe012f 100644 --- a/data/org.freedesktop.portal.Account.xml +++ b/data/org.freedesktop.portal.Account.xml @@ -50,6 +50,7 @@ will do with the returned information, for example: "Allows your personal information to be included with recipes you share with your friends". + The following results get returned via the #org.freedesktop.portal.Request::Response signal: * ``id`` (``s``) diff --git a/data/org.freedesktop.portal.Background.xml b/data/org.freedesktop.portal.Background.xml index 10a95ac52..36212a190 100644 --- a/data/org.freedesktop.portal.Background.xml +++ b/data/org.freedesktop.portal.Background.xml @@ -59,6 +59,7 @@ * ``dbus-activatable`` (``b``) true to use D-Bus activation for autostart. + The following results get returned via the #org.freedesktop.portal.Request::Response signal: * ``background`` (``b``) diff --git a/data/org.freedesktop.portal.Camera.xml b/data/org.freedesktop.portal.Camera.xml index f6552656a..62af483e0 100644 --- a/data/org.freedesktop.portal.Camera.xml +++ b/data/org.freedesktop.portal.Camera.xml @@ -33,16 +33,11 @@ Request to gain access to the camera. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - + + ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. Following the #org.freedesktop.portal.Request::Response signal, if granted, org.freedesktop.portal.Camera.OpenPipeWireRemote() can be used to @@ -59,8 +54,7 @@ Open a file descriptor to the PipeWire remote where the camera nodes are available. The file descriptor should be used to create a - pw_core object, by using - pw_context_connect_fd. + ``pw_core`` object, by using ``pw_context_connect_fd()``. This method will only succeed if the application already has permission to access camera devices. diff --git a/data/org.freedesktop.portal.Clipboard.xml b/data/org.freedesktop.portal.Clipboard.xml index 912341c96..ebe7c0a49 100644 --- a/data/org.freedesktop.portal.Clipboard.xml +++ b/data/org.freedesktop.portal.Clipboard.xml @@ -50,23 +50,18 @@ @session_handle: Object path for the #org.freedesktop.portal.Session object @options: Vardict with optional further information - Sets the owner of the clipboard formats in 'mime_types' in @options to + Sets the owner of the clipboard formats in ``mime_types`` in @options to the session, i.e. this session has data for the advertised clipboard formats. See #org.freedesktop.portal.FileTransfer to transfer files using the - 'application/vnd.portal.filetransfer' mimetype. + ``application/vnd.portal.filetransfer`` mimetype. May only be called if clipboard access was given after starting the session. Supported keys in the @options vardict include: - - - mime_types as - - A list of mime types that the session has clipboard content for. - - - + + ``mime_types`` (``as``) + A list of mime types that the session has clipboard content for. --> @@ -95,7 +90,7 @@ @session_handle: Object path for the #org.freedesktop.portal.Session object @serial: The serial of the request where this answer is directed to @success: A boolean which indicates whether the transfer of the clipboard - data was successful ('true') or not ('false') + data was successful ('true') or not ('false') Notifies that the transfer of the clipboard data has either completed successfully, or failed. @@ -110,12 +105,13 @@ @@ -135,20 +131,11 @@ Caller will only be notified if clipboard access was given after starting the session. Supported keys in the @options vardict include: - - - mime_types as - - A list of mime types that the the new clipboard selection has content for. - - - - session_is_owner b - - A boolean for whether the session is the owner of the clipboard selection ('true') or not ('false'). - - - + + ``mime_types`` (``as``) + A list of MIME types for which the new clipboard selection has content + ``session_is_owner`` (``b``) + A boolean for whether the session is the owner of the clipboard selection ('true') or not ('false') --> diff --git a/data/org.freedesktop.portal.Device.xml b/data/org.freedesktop.portal.Device.xml index 3caf19429..ca57ec46f 100644 --- a/data/org.freedesktop.portal.Device.xml +++ b/data/org.freedesktop.portal.Device.xml @@ -34,23 +34,27 @@ diff --git a/data/org.freedesktop.portal.Documents.xml b/data/org.freedesktop.portal.Documents.xml index e421fe33d..61b2ecd93 100644 --- a/data/org.freedesktop.portal.Documents.xml +++ b/data/org.freedesktop.portal.Documents.xml @@ -30,12 +30,12 @@ available to sandboxed applications in a controlled way. Exported files will be made accessible to the application via - a fuse filesystem that gets mounted at /run/user/$UID/doc/. The + a fuse filesystem that gets mounted at ``/run/user/$UID/doc/``. The filesystem gets mounted both outside and inside the sandbox, but the view inside the sandbox is restricted to just those files that the application is allowed to access. - Individual files will appear at /run/user/$UID/doc/$DOC_ID/filename, + Individual files will appear at ``/run/user/$UID/doc/$DOC_ID/filename``, where $DOC_ID is the ID of the file in the document store. It is returned by the org.freedesktop.portal.Documents.Add() and org.freedesktop.portal.Documents.AddNamed() calls. @@ -58,7 +58,7 @@ @path: the path at which the fuse filesystem is mounted Returns the path at which the document store fuse filesystem - is mounted. This will typically be /run/user/$UID/doc/. + is mounted. This will typically be ``/run/user/$UID/doc/``. --> @@ -105,31 +105,35 @@ @@ -145,27 +149,29 @@ AddNamedFull: @o_path_fds: open file descriptor for the parent directory @filename: the basename for the file - @flags: flags, 1 == reuse_existing, 2 == persistent, 4 == as-needed-by-app + @flags: flags, 1 == ``reuse_existing``, 2 == ``persistent``, 4 == ``as-needed-by-app`` @app_id: an application ID, or empty string @permissions: the permissions to grant, possible values are 'read', 'write', 'grant-permissions' and 'delete' @doc_id: the ID of the file in the document store @extra_info: Extra info returned + .. info:: + This method was added in version 3 of the #org.freedesktop.portal.Documents interface. + + Creates an entry in the document store for writing a new file. - If the as-needed-by-app flag is given, file will only be added to + If the ``as-needed-by-app`` flag is given, file will only be added to the document store if the application does not already have access to it. - For file that is not added to the document store, the doc_id will + For file that is not added to the document store, the @doc_id will contain an empty string. - Additionally, if app_id is specified, it will be given the permissions + Additionally, if @app_id is specified, it will be given the permissions listed in org.freedesktop.portal.Documents.GrantPermissions(). The method also returns some extra info that can be used to avoid multiple roundtrips. For now it only contains as "mountpoint", the fuse mountpoint of the document portal. - - This method was added in version 3 of the #org.freedesktop.portal.Documents interface. --> @@ -182,13 +188,14 @@ GrantPermissions: @doc_id: the ID of the file in the document store @app_id: the ID of the application to which permissions are granted - @permissions: the permissions to grant, possible values are 'read', 'write', 'grant-permissions' and 'delete' + @permissions: the permissions to grant, possible values are ``read``, ``write``, ``grant-permissions`` and ``delete`` Grants access permissions for a file in the document store to an application. - This call is available inside the sandbox if the application - has the 'grant-permissions' permission for the document. + .. info:: + This call is available inside the sandbox if the application + has the ``grant-permissions`` permission for the document. --> @@ -205,8 +212,9 @@ Revokes access permissions for a file in the document store from an application. - This call is available inside the sandbox if the application - has the 'grant-permissions' permission for the document. + .. info:: + This call is available inside the sandbox if the application + has the ``grant-permissions`` permission for the document. --> @@ -221,8 +229,9 @@ Removes an entry from the document store. The file itself is not deleted. - This call is available inside the sandbox if the application - has the 'delete' permission for the document. + .. info:: + This call is available inside the sandbox if the application + has the ``delete`` permission for the document. --> @@ -235,7 +244,8 @@ Looks up the document ID for a file. - This call is not available inside the sandbox. + .. info:: + This call is not available inside the sandbox. --> @@ -251,7 +261,8 @@ Gets the filesystem path and application permissions for a document store entry. - This call is not available inside the sandbox. + .. info:: + This call is not available inside the sandbox. --> @@ -267,7 +278,8 @@ Lists documents in the document store for an application (or for all applications). - This call is not available inside the sandbox. + .. info:: + This call is not available inside the sandbox. --> diff --git a/data/org.freedesktop.portal.DynamicLauncher.xml b/data/org.freedesktop.portal.DynamicLauncher.xml index a6ce2cb33..c94ffd6ae 100644 --- a/data/org.freedesktop.portal.DynamicLauncher.xml +++ b/data/org.freedesktop.portal.DynamicLauncher.xml @@ -31,15 +31,18 @@ launchers. The portal also allows apps to uninstall the launchers, launch them, and read the desktop file and icon data for them. - The standard way to install a launcher is to use the PrepareInstall() method + The standard way to install a launcher is to use the + org.freedesktop.portal.DynamicLauncher.PrepareInstall() method which results in a dialog being presented to the user so they can confirm - they want to install the launcher. Then, the token returned by PrepareInstall() - would be passed to the Install() method to complete the installation. + they want to install the launcher. Then, the token returned by + org.freedesktop.portal.DynamicLauncher.PrepareInstall() + would be passed to the org.freedesktop.portal.DynamicLauncher.Install() + method to complete the installation. However, in the rare circumstance that an unsandboxed process such as a system component needs to install a launcher without user interaction, this - can be accomplished by using the RequestInstallToken() method and passing - the acquired token to Install(). + can be accomplished by using the org.freedesktop.portal.DynamicLauncher.RequestInstallToken() + method and passing the acquired token to org.freedesktop.portal.DynamicLauncher.Install(). This documentation describes version 1 of this interface. --> @@ -47,7 +50,7 @@ @@ -175,9 +151,9 @@ @@ -318,10 +287,8 @@ A bitmask of available launcher types. Currently defined types are: - - 1: Application. A launcher that represents an application. - 2: Webapp. A launcher that represents a web app. - + - 1: Application. A launcher that represents an application. + - 2: Webapp. A launcher that represents a web app. --> diff --git a/data/org.freedesktop.portal.Email.xml b/data/org.freedesktop.portal.Email.xml index 4ff173039..eae08a1a0 100644 --- a/data/org.freedesktop.portal.Email.xml +++ b/data/org.freedesktop.portal.Email.xml @@ -31,95 +31,71 @@ diff --git a/data/org.freedesktop.portal.FileChooser.xml b/data/org.freedesktop.portal.FileChooser.xml index c8472a2d0..3cabd68c6 100644 --- a/data/org.freedesktop.portal.FileChooser.xml +++ b/data/org.freedesktop.portal.FileChooser.xml @@ -29,14 +29,14 @@ The selected files will be made accessible to the application via the document portal, and the returned URI will point - into the document portal fuse filesystem in /run/user/$UID/doc/. + into the document portal fuse filesystem in ``/run/user/$UID/doc/``. This documentation describes version 4 of this interface. --> @@ -214,134 +148,76 @@ Asks for a location to save a file. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - accept_label s - - Label for the accept button. Mnemonic underlines are allowed. - - - - modal b - - Whether the dialog should be modal. Default is yes. - - - - filters a(sa(us)) - - List of serialized file filters. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_filter (sa(us)) - - - Request that this filter be set by default at dialog creation. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - This option was added in version 4 of this interface. - - - - - choices a(ssa(ss)s) - - List of serialized combo boxes. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_name s - Suggested name of the file. - - - current_folder ay - - - Suggested folder in which the file should be saved. The byte array - contains a path in the same encoding as the file system, and it's - expected to be terminated by a nul byte. - - - If the path points to a location in the document storage, it will be - replaced with the path to the location on the host. - - - The portal implementation is free to ignore this option. - - - - - current_file ay - - - The current file (when saving an existing file), in the same encoding as the file - system. The byte array is expected to be terminated by a nul byte. - - - - + + * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``accept_label`` (``s``) + Label for the accept button. Mnemonic underlines are allowed. + + * ``modal`` (``b``) + Whether the dialog should be modal. Default is yes. + + * ``filters`` (``a(sa(us))``) + List of serialized file filters. + + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_filter`` (``(sa(us))``) + Request that this filter be set by default at dialog creation. + + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``choices`` (``a(ssa(ss)s)``) + List of serialized combo boxes. + + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_name``(``s``) + Suggested name of the file. + + * ``current_folder`` (``ay``) + Suggested folder in which the file should be saved. The byte array + contains a path in the same encoding as the file system, and it's + expected to be terminated by a nul byte. + + If the path points to a location in the document storage, it will be + replaced with the path to the location on the host. + + The portal implementation is free to ignore this option. + + * ``current_file`` (``ay``) + The current file (when saving an existing file), in the same encoding as the file + system. The byte array is expected to be terminated by a nul byte. + The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - uris as - - An array of strings containing the uri of the selected file. All - URIs have the "file://" scheme. - - - - choices a(ss) - - An array of pairs of strings, corresponding to the passed-in choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_filter (sa(us)) - - - The filter that was selected. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - This option was added in version 4 of this interface. - - - - - current_folder ay - - - Suggested folder in which the file should be saved. The byte array - contains a path in the same encoding as the file system, and it's - expected to be terminated by a nul byte. - - - If the path points to a location in the document storage, it will be - replaced with the path to the location on the host. - - - The portal implementation is free to ignore this option. - - - This option was added in version 4 of this interface. - - - - + + * ``uris`` (``as``) + An array of strings containing the uri of the selected file. All URIs + have the "file://" scheme. + + * ``choices`` (``a(ss)``) + An array of pairs of strings, corresponding to the passed-in choices. + + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_filter`` (``(sa(us))``) + The filter that was selected. + + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_folder`` (``ay``) + Suggested folder in which the file should be saved. The byte array + contains a path in the same encoding as the file system, and it's + expected to be terminated by a nul byte. + + If the path points to a location in the document storage, it will be + replaced with the path to the location on the host. + + The portal implementation is free to ignore this option. --> @@ -364,89 +240,54 @@ construct a unique file name and return that instead. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the - @handle. Must be a valid object path element. See the - #org.freedesktop.portal.Request documentation for more - information about the @handle. - - - - accept_label s - - Label for the accept button. Mnemonic underlines are allowed. - - - - modal b - - Whether the dialog should be modal. Default is yes. - - - - choices a(ssa(ss)s) - - List of serialized combo boxes. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_folder ay - - - Suggested folder in which the files should be saved. The byte array - contains a path in the same encoding as the file system, and it's - expected to be terminated by a nul byte. - - - If the path points to a location in the document storage, it will be - replaced with the path to the location on the host. - - - The portal implementation is free to ignore this option. - - - - - files aay - - - An array of file names, using the same encoding as the file system, - to be saved. Each byte array is expected to be terminated by a nul - byte. - - - - + + * ``handle_token`` (``s``) + A string that will be used as the last element of the + @handle. Must be a valid object path element. See the + #org.freedesktop.portal.Request documentation for more + information about the @handle. + + * ``accept_label`` (``s``) + Label for the accept button. Mnemonic underlines are allowed. + + * ``modal`` (``b``) + Whether the dialog should be modal. Default is yes. + + * ``choices`` (``a(ssa(ss)s)``) + List of serialized combo boxes. + + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_folder`` (``ay``) + Suggested folder in which the files should be saved. The byte array + contains a path in the same encoding as the file system, and it's + expected to be terminated by a nul byte. + + If the path points to a location in the document storage, it will be + replaced with the path to the location on the host. + + The portal implementation is free to ignore this option. + + * ``files`` (``aay``) + An array of file names, using the same encoding as the file system, + to be saved. Each byte array is expected to be terminated by a nul + The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - uris as - - - An array of strings containing the uri corresponding to - each file given by @options, in the same order. Note that - the file names may have changed, for example if a file - with the same name in the selected folder already exists. - - - All URIs have the "file://" scheme. - - - - - choices a(ss) - - An array of pairs of strings, corresponding to the passed-in choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - + + * ``uris`` (``as``) + An array of strings containing the uri corresponding to + each file given by @options, in the same order. Note that + the file names may have changed, for example if a file + with the same name in the selected folder already exists. + + All URIs have the "file://" scheme. + + * ``choices`` (``a(ss)``) + An array of pairs of strings, corresponding to the passed-in choices. + + See org.freedesktop.portal.FileChooser.OpenFile() for details. --> diff --git a/data/org.freedesktop.portal.Request.xml b/data/org.freedesktop.portal.Request.xml index c1abb4eb7..b5d81110d 100644 --- a/data/org.freedesktop.portal.Request.xml +++ b/data/org.freedesktop.portal.Request.xml @@ -36,9 +36,14 @@ org.freedesktop.portal.Request.Close() on the Request object. Since version 0.9 of xdg-desktop-portal, the handle will be of the form - /org/freedesktop/portal/desktop/request/SENDER/TOKEN, - where SENDER is the callers unique name, with the initial ':' removed and - all '.' replaced by '_', and TOKEN is a unique token that the caller provided + + :: + + /org/freedesktop/portal/desktop/request/SENDER/TOKEN + + + where ``SENDER`` is the callers unique name, with the initial ``':'`` removed and + all ``'.'`` replaced by ``'_'``, and ``TOKEN`` is a unique token that the caller provided with the handle_token key in the options vardict. This change was made to let applications subscribe to the Response signal before @@ -58,6 +63,7 @@ Closes the portal request to which this object refers and ends all related user interaction (dialogs, etc). + A Response signal will not be emitted in this case. --> @@ -71,11 +77,10 @@ Emitted when the user interaction for a portal request is over. The @response indicates how the user interaction ended: - - 0: Success, the request is carried out - 1: The user cancelled the interaction - 2: The user interaction was ended in some other way - + + - 0: Success, the request is carried out + - 1: The user cancelled the interaction + - 2: The user interaction was ended in some other way --> diff --git a/doc/index.rst b/doc/index.rst index b8d95a057..765904764 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -28,4 +28,11 @@ Welcome to XDG Desktop Portals's documentation! implementation-interfaces +.. toctree:: + :maxdepth: 1 + :caption: For system developers + + background-app-monitor + + Welcome to the documentation for XDG Desktop Portals. diff --git a/doc/meson.build b/doc/meson.build index b685bb090..7e27fe013 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -43,6 +43,9 @@ if build_documentation foreach i: portal_impl_sources all_interfaces_xml += i endforeach + foreach i: background_monitor_sources + all_interfaces_xml += i + endforeach # Replace the extension for gdbus-codegen all_interfaces_rst = [] @@ -64,6 +67,7 @@ if build_documentation 'common-conventions.rst', 'portal-interfaces.rst', 'implementation-interfaces.rst', + 'background-app-monitor.rst', ] copied_docs_sources = [] diff --git a/src/meson.build b/src/meson.build index 3b9fa9d46..884b6f60f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -16,7 +16,7 @@ impl_built_sources = gnome.gdbus_codegen( docbook: 'portal', autocleanup: 'none', ) -background_monitor_sources = gnome.gdbus_codegen( +background_monitor_built_sources = gnome.gdbus_codegen( 'xdp-background-dbus', sources: background_monitor_sources, interface_prefix: 'org.freedesktop.background', @@ -103,7 +103,7 @@ xdg_desktop_portal_sources += [ xdp_method_info_sources, portal_built_sources, impl_built_sources, - background_monitor_sources, + background_monitor_built_sources, geoclue_built_sources, built_resources, ] From 96888c09483865fa0c39259e6940e2c69afd5767 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 26 Oct 2023 22:14:31 +0100 Subject: [PATCH 20/82] docs: Add page on the background monitoring API --- doc/background-app-monitor.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 doc/background-app-monitor.rst diff --git a/doc/background-app-monitor.rst b/doc/background-app-monitor.rst new file mode 100644 index 000000000..ba57f4055 --- /dev/null +++ b/doc/background-app-monitor.rst @@ -0,0 +1,16 @@ +Background Apps Monitoring API +============================== + +In addition to managing the regular interfaces that sandboxed applications +use to interfact with the host system, xdg-desktop-portals also monitors +running applications without an active window - if the portal backend +provides an implementation of the Background portal. + +This API can be used by host system services to provide rich interfaces to +manage background running applications. + + +.. toctree:: + :maxdepth: 1 + + doc-org.freedesktop.background.Monitor.rst From cfcb27d1cb64d636da2ca4145aee21a0a7f01f26 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Fri, 27 Oct 2023 13:10:45 +0100 Subject: [PATCH 21/82] docs: Remove admonitions The Sphinx theme draws too much attention to them, defeating the point. --- data/org.freedesktop.portal.Account.xml | 4 +- data/org.freedesktop.portal.Background.xml | 3 +- data/org.freedesktop.portal.Documents.xml | 42 ++++++++------------- data/org.freedesktop.portal.FileChooser.xml | 26 +++++++------ 4 files changed, 33 insertions(+), 42 deletions(-) diff --git a/data/org.freedesktop.portal.Account.xml b/data/org.freedesktop.portal.Account.xml index c67fe012f..a272116bd 100644 --- a/data/org.freedesktop.portal.Account.xml +++ b/data/org.freedesktop.portal.Account.xml @@ -39,12 +39,12 @@ Supported keys in the @options vardict include: - * ``handle_token`` (``s``) + ``handle_token`` (``s``) A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. - * ``reason`` (``s``) + ``reason`` (``s``) A string that can be shown in the dialog to explain why the information is needed. This should be a complete sentence that explains what the application will do with the returned information, for example: "Allows your personal diff --git a/data/org.freedesktop.portal.Background.xml b/data/org.freedesktop.portal.Background.xml index 36212a190..f77431709 100644 --- a/data/org.freedesktop.portal.Background.xml +++ b/data/org.freedesktop.portal.Background.xml @@ -78,8 +78,7 @@ SetStatus: @options: Vardict with optional further information - .. note:: - This method was added in version 2. + This method was added in version 2 of this interface. Sets the status of the application running in background. diff --git a/data/org.freedesktop.portal.Documents.xml b/data/org.freedesktop.portal.Documents.xml index 61b2ecd93..d5a76372a 100644 --- a/data/org.freedesktop.portal.Documents.xml +++ b/data/org.freedesktop.portal.Documents.xml @@ -111,14 +111,6 @@ @doc_ids: the IDs of the files in the document store @extra_info: Extra info returned - .. info:: - This method was added in version 2 of the #org.freedesktop.portal.Documents interface. - - - .. info:: - Support for exporting directories was added in version 4 of the #org.freedesktop.portal.Documents interface. - - Adds multiple files to the document store. The file is passed in the form of an open file descriptor to prove that the caller has access to the file. @@ -134,6 +126,10 @@ The method also returns some extra info that can be used to avoid multiple roundtrips. For now it only contains as "mountpoint", the fuse mountpoint of the document portal. + + This method was added in version 2 of this interface. + + Support for exporting directories was added in version 4 of this interface. --> @@ -155,10 +151,6 @@ @doc_id: the ID of the file in the document store @extra_info: Extra info returned - .. info:: - This method was added in version 3 of the #org.freedesktop.portal.Documents interface. - - Creates an entry in the document store for writing a new file. If the ``as-needed-by-app`` flag is given, file will only be added to @@ -172,6 +164,8 @@ The method also returns some extra info that can be used to avoid multiple roundtrips. For now it only contains as "mountpoint", the fuse mountpoint of the document portal. + + This method was added in version 3 of this interface. --> @@ -193,9 +187,8 @@ Grants access permissions for a file in the document store to an application. - .. info:: - This call is available inside the sandbox if the application - has the ``grant-permissions`` permission for the document. + This call is available inside the sandbox if the application + has the ``grant-permissions`` permission for the document. --> @@ -212,9 +205,8 @@ Revokes access permissions for a file in the document store from an application. - .. info:: - This call is available inside the sandbox if the application - has the ``grant-permissions`` permission for the document. + This call is available inside the sandbox if the application + has the ``grant-permissions`` permission for the document. --> @@ -229,9 +221,8 @@ Removes an entry from the document store. The file itself is not deleted. - .. info:: - This call is available inside the sandbox if the application - has the ``delete`` permission for the document. + This call is available inside the sandbox if the application + has the ``delete`` permission for the document. --> @@ -244,8 +235,7 @@ Looks up the document ID for a file. - .. info:: - This call is not available inside the sandbox. + This call is not available inside the sandbox. --> @@ -261,8 +251,7 @@ Gets the filesystem path and application permissions for a document store entry. - .. info:: - This call is not available inside the sandbox. + This call is not available inside the sandbox. --> @@ -278,8 +267,7 @@ Lists documents in the document store for an application (or for all applications). - .. info:: - This call is not available inside the sandbox. + This call is not available inside the sandbox. --> diff --git a/data/org.freedesktop.portal.FileChooser.xml b/data/org.freedesktop.portal.FileChooser.xml index 3cabd68c6..7753c5c89 100644 --- a/data/org.freedesktop.portal.FileChooser.xml +++ b/data/org.freedesktop.portal.FileChooser.xml @@ -68,18 +68,21 @@ List of serialized file filters. Each item in the array specifies a single filter to offer to the user. + The first string is a user-visible name for the filter. The ``a(us)`` - specifies a list of filter strings, which can be either a glob-style pattern - (indicated by 0) or a MIME type (indicated by 1). Patterns are case-sensitive. - To match different capitalizations of, e.g. ``'*.ico'``, use a pattern like - ``'*.[iI][cC][oO]'``. + specifies a list of filter strings, which can be either a glob-style + pattern (indicated by 0) or a MIME type (indicated by 1). Patterns are + case-sensitive. + + To match different capitalizations of, e.g. ``'*.ico'``, use a pattern + like: ``'*.[iI][cC][oO]'``. Example: ``[('Images', [(0, '*.ico'), (1, 'image/png')]), ('Text', [(0, '*.txt')])]`` - .. note:: - Note that filters are purely there to aid the user in making a useful selection. - The portal may still allow the user to select files that don't match any filter - criteria, and applications must be prepared to handle that. + Note that filters are purely there to aid the user in making a useful + selection. The portal may still allow the user to select files that + don't match any filter criteria, and applications must be prepared to + handle that. * ``current_filter`` (``(sa(us))``) Request that this filter be set by default at dialog creation. If @@ -105,9 +108,10 @@ Example: ``[('encoding', 'Encoding', [('utf8', 'Unicode (UTF-8)'), ('latin15', 'Western')], 'latin15'), ('reencode', 'Reencode', [], 'false')]`` * ``current_folder`` (``ay``) - Suggested folder from which the files should be opened. The byte array - contains a path in the same encoding as the file system, and it's - expected to be terminated by a nul byte. + Suggested folder from which the files should be opened. + + The byte array contains a path in the same encoding as the file + system, and it's expected to be terminated by a nul byte. If the path points to a location in the document storage, it will be replaced with the path to the location on the host. From c02771f107cc7ef7eaaf6156df0b070aebbcce97 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Fri, 27 Oct 2023 13:13:33 +0100 Subject: [PATCH 22/82] docs: Port FileTransfer docs from XML to rST --- data/org.freedesktop.portal.FileTransfer.xml | 38 +++++++++----------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/data/org.freedesktop.portal.FileTransfer.xml b/data/org.freedesktop.portal.FileTransfer.xml index f789578f7..15bb82c75 100644 --- a/data/org.freedesktop.portal.FileTransfer.xml +++ b/data/org.freedesktop.portal.FileTransfer.xml @@ -41,7 +41,7 @@ The D-Bus interface for the this portal is available under the bus name org.freedesktop.portal.Documents and the object path - /org/freedesktop/portal/documents. + ``/org/freedesktop/portal/documents``. This documentation describes version 1 of this interface. --> @@ -52,6 +52,7 @@ @key: a key that needs to be passed to org.freedesktop.portal.FileTransfer.RetrieveFiles() to obtain the files Starts a session for a file transfer. + The caller should call org.freedesktop.portal.FileTransfer.AddFiles() at least once, to add files to this session. @@ -60,26 +61,21 @@ it has the @key. Supported keys in the @options vardict include: - - - writable b - - Whether to allow the chosen application to write to the files. - Default: False - - This key only takes effect for files that need to be exported - in the document portal for the receiving app. But it does require - the passed-in file descriptors to be writable. - - - - autostop b - - Whether to stop the transfer automatically after the first - org.freedesktop.portal.FileTransfer.RetrieveFiles() call. Default: True - - - + + * ``writable`` (``b``) + Whether to allow the chosen application to write to the files. + + This key only takes effect for files that need to be exported + in the document portal for the receiving app. But it does require + the passed-in file descriptors to be writable. + + Default: False + + * ``autostop`` (``b``) + Whether to stop the transfer automatically after the first + org.freedesktop.portal.FileTransfer.RetrieveFiles() call. + + Default: True --> From 0a0ffdb89bd3131e515f3789223f91c3c12f1e38 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Fri, 27 Oct 2023 13:18:53 +0100 Subject: [PATCH 23/82] docs: Port GameMode documentation from XML to rST --- data/org.freedesktop.portal.GameMode.xml | 74 ++++++++++++++---------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/data/org.freedesktop.portal.GameMode.xml b/data/org.freedesktop.portal.GameMode.xml index c4c88785b..5976a9863 100644 --- a/data/org.freedesktop.portal.GameMode.xml +++ b/data/org.freedesktop.portal.GameMode.xml @@ -27,11 +27,11 @@ page for pid_namespaces(7) for more details, but briefly, it means that the sandbox has its own process id namespace which is separated from the one on the host. Thus there will be two - separate process ids (pids) within two different namespaces - that both identify same process. One id from the pid namespace - inside the sandbox and one id from the host pid namespace. + separate process ids (PID) within two different namespaces + that both identify same process. One id from the PID namespace + inside the sandbox and one id from the host PID namespace. Since org.freedesktop.portal.GameMode expects pids from the host - pid namespace but programs inside the sandbox can only know pids + PID namespace but programs inside the sandbox can only know PID from the sandbox namespace, process ids need to be translated from the portal to the host namespace. The portal will do that transparently for all calls where this is necessary. @@ -41,7 +41,8 @@ org.freedesktop.portal.GameMode.RegisterGame(). In the event that a client terminates without a call to the org.freedesktop.portal.GameMode.UnregisterGame() method, GameMode will - automatically un-register the client. This might happen with a (small) delay. + automatically un-register the client. This might happen with a (small) + delay. This documentation describes version 4 of this interface. --> @@ -49,16 +50,21 @@ @@ -70,14 +76,20 @@ @result: Status of the request: 0 for success, -1 indicates an error Register a game with GameMode and thus request GameMode to - be activated. If the caller is running inside a sandbox with - pid namespace isolation, the pid will be translated to the - respective host pid. See the general introduction for details. + be activated. + + If the caller is running inside a sandbox with PID namespace + isolation, the @pid will be translated to the respective host PID. + + See the general introduction for details. + If the GameMode has already been requested for @pid before, this call will fail, i.e. result will be -1. - Will return: - 0 if the game with @pid was successfully registered, - -1 if the request was rejected by GameMode + + The @result will be one of: + + - `0` if the game with @pid was successfully registered + - `-1` if the request was rejected by GameMode --> @@ -88,14 +100,18 @@ @pid: Process id of the game to un-register @result: Status of the request: 0 for success, -1 indicates an error - Un-register a game from GameMode; if the call is successful - and there are no other games or clients registered, GameMode - will be deactivated. If the caller is running inside a sandbox - with pid namespace isolation, the pid will be translated to - the respective host pid. - Will return: - 0 if the game with @pid was successfully un-registered, - -1 if the request was rejected by GameMode + Un-register a game from GameMode. + + If the call is successful and there are no other games or clients + registered, GameMode will be deactivated. + + If the caller is running inside a sandbox with PID namespace + isolation, the @pid will be translated to the respective host PID. + + The @result will be one of: + + - `0` if the game with @pid was successfully un-registered + - `-1` if the request was rejected by GameMode --> From bf550244f8c6cc91b67eebac430b10ce540ba70f Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Mon, 20 Nov 2023 10:54:24 -0300 Subject: [PATCH 24/82] Improve output of ported docs Add a newline between the bullet point and the paragraph so that the generated output separates them in newlines as well. --- data/org.freedesktop.portal.Account.xml | 9 +++-- data/org.freedesktop.portal.Background.xml | 7 ++++ data/org.freedesktop.portal.Camera.xml | 2 +- data/org.freedesktop.portal.Clipboard.xml | 10 ++++-- data/org.freedesktop.portal.Device.xml | 3 +- ...org.freedesktop.portal.DynamicLauncher.xml | 9 +++++ data/org.freedesktop.portal.Email.xml | 11 ++++++- data/org.freedesktop.portal.FileChooser.xml | 33 +++++++++++++++++++ data/org.freedesktop.portal.FileTransfer.xml | 2 ++ data/org.freedesktop.portal.Screenshot.xml | 5 +++ data/org.freedesktop.portal.Secret.xml | 2 ++ data/org.freedesktop.portal.Settings.xml | 2 ++ data/org.freedesktop.portal.Wallpaper.xml | 4 +++ 13 files changed, 91 insertions(+), 8 deletions(-) diff --git a/data/org.freedesktop.portal.Account.xml b/data/org.freedesktop.portal.Account.xml index a272116bd..651c8516b 100644 --- a/data/org.freedesktop.portal.Account.xml +++ b/data/org.freedesktop.portal.Account.xml @@ -39,12 +39,14 @@ Supported keys in the @options vardict include: - ``handle_token`` (``s``) + * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. - ``reason`` (``s``) + * ``reason`` (``s``) + A string that can be shown in the dialog to explain why the information is needed. This should be a complete sentence that explains what the application will do with the returned information, for example: "Allows your personal @@ -54,12 +56,15 @@ The following results get returned via the #org.freedesktop.portal.Request::Response signal: * ``id`` (``s``) + The user id. * ``name`` (``s``) + The user's real name. * ``image`` (``s``) + The URI of an image file for the user's avatar photo. --> diff --git a/data/org.freedesktop.portal.Background.xml b/data/org.freedesktop.portal.Background.xml index f77431709..2ae9e7799 100644 --- a/data/org.freedesktop.portal.Background.xml +++ b/data/org.freedesktop.portal.Background.xml @@ -41,31 +41,38 @@ Supported keys in the @options vardict include: * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. * ``reason`` (``s``) + User-visible reason for the request. * ``autostart`` (``b``) + true if the app also wants to be started automatically at login. * ``commandline`` (``as``) + Commandline to use add when autostarting at login. If this is not specified, the ``Exec`` key from the desktop file will be used. * ``dbus-activatable`` (``b``) + true to use D-Bus activation for autostart. The following results get returned via the #org.freedesktop.portal.Request::Response signal: * ``background`` (``b``) + true if the application is allowed to run in the background. * ``autostart`` (``b``) + true if the application is will be autostarted. --> diff --git a/data/org.freedesktop.portal.Camera.xml b/data/org.freedesktop.portal.Camera.xml index 62af483e0..2cf3cf111 100644 --- a/data/org.freedesktop.portal.Camera.xml +++ b/data/org.freedesktop.portal.Camera.xml @@ -34,7 +34,7 @@ Supported keys in the @options vardict include: - ``handle_token`` (``s``) + * ``handle_token`` (``s``) A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. diff --git a/data/org.freedesktop.portal.Clipboard.xml b/data/org.freedesktop.portal.Clipboard.xml index ebe7c0a49..5b044aa17 100644 --- a/data/org.freedesktop.portal.Clipboard.xml +++ b/data/org.freedesktop.portal.Clipboard.xml @@ -60,7 +60,8 @@ Supported keys in the @options vardict include: - ``mime_types`` (``as``) + * ``mime_types`` (``as``) + A list of mime types that the session has clipboard content for. --> @@ -132,9 +133,12 @@ Supported keys in the @options vardict include: - ``mime_types`` (``as``) + * ``mime_types`` (``as``) + A list of MIME types for which the new clipboard selection has content - ``session_is_owner`` (``b``) + + * ``session_is_owner`` (``b``) + A boolean for whether the session is the owner of the clipboard selection ('true') or not ('false') --> diff --git a/data/org.freedesktop.portal.Device.xml b/data/org.freedesktop.portal.Device.xml index ca57ec46f..ea68475ab 100644 --- a/data/org.freedesktop.portal.Device.xml +++ b/data/org.freedesktop.portal.Device.xml @@ -51,7 +51,8 @@ Supported keys in the @options vardict include: - ``handle_token`` (``s``) + * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. diff --git a/data/org.freedesktop.portal.DynamicLauncher.xml b/data/org.freedesktop.portal.DynamicLauncher.xml index c94ffd6ae..0efe5ebac 100644 --- a/data/org.freedesktop.portal.DynamicLauncher.xml +++ b/data/org.freedesktop.portal.DynamicLauncher.xml @@ -107,37 +107,45 @@ Supported keys in the @options vardict: * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. * ``modal`` (``b``) + Whether to make the dialog modal. Defaults to true. * ``launcher_type`` (``u``) + The type of launcher being created. For supported values see the #org.freedesktop.portal.DynamicLauncher:SupportedLauncherTypes property. Defaults to "Application". * ``target`` (``s``) + For a launcher of type "Webapp", this is the URL of the web app being installed. This is displayed in the user-facing dialog. For other launcher types, this is not needed. * ``editable_name`` (``b``) + If true, the user will be able to edit the name of the launcher. Defaults to true. * ``editable_icon`` (``b``) + If true, the user will be able to edit the icon of the launcher, if the implementation supports this. Defaults to false. The following results get returned via the #org.freedesktop.portal.Request::Response signal: * ``name`` (``s``) + The name chosen by the user for the launcher. * ``token`` (``s``) + Token that can be passed to a subsequent org.freedesktop.portal.DynamicLauncher.Install() call to complete the installation without another dialog. --> @@ -276,6 +284,7 @@ Supported keys in the @options vardict include: * ``activation_token`` (``s``) + A token that can be used to activate the chosen application. --> diff --git a/data/org.freedesktop.portal.Email.xml b/data/org.freedesktop.portal.Email.xml index eae08a1a0..515c7dd88 100644 --- a/data/org.freedesktop.portal.Email.xml +++ b/data/org.freedesktop.portal.Email.xml @@ -58,46 +58,55 @@ Supported keys in the @options vardict include: * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. * ``address`` (``s``) + The email address to send to. Must conform to the HTML5 definition of a [valid email address](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address). * ``addresses`` (``as``) + Email addresses to send to. This will be used in addition to address and must pass the same validation. This option was introduced in version 3 of the interface. * ``cc`` (``as``) + Email addresses to cc. This option was introduced in version 3 of the interface. * ``bcc`` (``as``) + Email addresses to bcc. This option was introduced in version 3 of the interface. * ``subject`` (``s``) + The subject for the email. * ``body`` (``s``) + The body for the email. * ``attachment_fds`` (``ah``) + File descriptors for files to attach. * ``activation_token`` (``s``) + A token that can be used to activate the chosen application. This option was introduced in version 4 of the interface. - All the keys in the options are are optional. + All the keys in the @options vardict are optional. --> diff --git a/data/org.freedesktop.portal.FileChooser.xml b/data/org.freedesktop.portal.FileChooser.xml index 7753c5c89..3c832436c 100644 --- a/data/org.freedesktop.portal.FileChooser.xml +++ b/data/org.freedesktop.portal.FileChooser.xml @@ -46,25 +46,31 @@ Supported keys in the @options vardict include: * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. * ``accept_label`` (``s``) + Label for the accept button. Mnemonic underlines are allowed. * ``modal`` (``b``) + Whether the dialog should be modal. Default is true. * ``multiple`` (``b``) + Whether multiple files can be selected or not. Default is single-selection. * ``directory`` (``b``) + Whether to select for folders instead of files. Default is to select files. This option was added in version 3. * ``filters`` (``a(sa(us))``) + List of serialized file filters. Each item in the array specifies a single filter to offer to the user. @@ -85,6 +91,7 @@ handle that. * ``current_filter`` (``(sa(us))``) + Request that this filter be set by default at dialog creation. If the filters list is nonempty, it should match a filter in the list to set the default filter from the list. Alternatively, it @@ -92,6 +99,7 @@ unconditionally. * ``choices`` (``a(ssa(ss)s)``) + List of serialized combo boxes to add to the file chooser. For each element, the first string is an ID that will be returned @@ -108,6 +116,7 @@ Example: ``[('encoding', 'Encoding', [('utf8', 'Unicode (UTF-8)'), ('latin15', 'Western')], 'latin15'), ('reencode', 'Reencode', [], 'false')]`` * ``current_folder`` (``ay``) + Suggested folder from which the files should be opened. The byte array contains a path in the same encoding as the file @@ -122,10 +131,12 @@ The following results get returned via the #org.freedesktop.portal.Request::Response signal: * ``uris`` (``as``) + An array of strings containing the uris of the selected files. All URIs have the "file://" scheme. * ``choices`` (``a(ss)``) + An array of pairs of strings, the first string being the ID of a combobox that was passed into this call, the second string being the selected option. @@ -133,6 +144,7 @@ Example: ``[('encoding', 'utf8'), ('reencode', 'true')]`` * ``current_filter`` (``(sa(us))``) + The filter that was selected. This may match a filter in the filter list or another filter that was applied unconditionally. --> @@ -154,35 +166,43 @@ Supported keys in the @options vardict include: * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. * ``accept_label`` (``s``) + Label for the accept button. Mnemonic underlines are allowed. * ``modal`` (``b``) + Whether the dialog should be modal. Default is yes. * ``filters`` (``a(sa(us))``) + List of serialized file filters. See org.freedesktop.portal.FileChooser.OpenFile() for details. * ``current_filter`` (``(sa(us))``) + Request that this filter be set by default at dialog creation. See org.freedesktop.portal.FileChooser.OpenFile() for details. * ``choices`` (``a(ssa(ss)s)``) + List of serialized combo boxes. See org.freedesktop.portal.FileChooser.OpenFile() for details. * ``current_name``(``s``) + Suggested name of the file. * ``current_folder`` (``ay``) + Suggested folder in which the file should be saved. The byte array contains a path in the same encoding as the file system, and it's expected to be terminated by a nul byte. @@ -193,6 +213,7 @@ The portal implementation is free to ignore this option. * ``current_file`` (``ay``) + The current file (when saving an existing file), in the same encoding as the file system. The byte array is expected to be terminated by a nul byte. @@ -200,20 +221,24 @@ The following results get returned via the #org.freedesktop.portal.Request::Response signal: * ``uris`` (``as``) + An array of strings containing the uri of the selected file. All URIs have the "file://" scheme. * ``choices`` (``a(ss)``) + An array of pairs of strings, corresponding to the passed-in choices. See org.freedesktop.portal.FileChooser.OpenFile() for details. * ``current_filter`` (``(sa(us))``) + The filter that was selected. See org.freedesktop.portal.FileChooser.OpenFile() for details. * ``current_folder`` (``ay``) + Suggested folder in which the file should be saved. The byte array contains a path in the same encoding as the file system, and it's expected to be terminated by a nul byte. @@ -246,23 +271,28 @@ Supported keys in the @options vardict include: * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. * ``accept_label`` (``s``) + Label for the accept button. Mnemonic underlines are allowed. * ``modal`` (``b``) + Whether the dialog should be modal. Default is yes. * ``choices`` (``a(ssa(ss)s)``) + List of serialized combo boxes. See org.freedesktop.portal.FileChooser.OpenFile() for details. * ``current_folder`` (``ay``) + Suggested folder in which the files should be saved. The byte array contains a path in the same encoding as the file system, and it's expected to be terminated by a nul byte. @@ -273,6 +303,7 @@ The portal implementation is free to ignore this option. * ``files`` (``aay``) + An array of file names, using the same encoding as the file system, to be saved. Each byte array is expected to be terminated by a nul @@ -281,6 +312,7 @@ #org.freedesktop.portal.Request::Response signal: * ``uris`` (``as``) + An array of strings containing the uri corresponding to each file given by @options, in the same order. Note that the file names may have changed, for example if a file @@ -289,6 +321,7 @@ All URIs have the "file://" scheme. * ``choices`` (``a(ss)``) + An array of pairs of strings, corresponding to the passed-in choices. See org.freedesktop.portal.FileChooser.OpenFile() for details. diff --git a/data/org.freedesktop.portal.FileTransfer.xml b/data/org.freedesktop.portal.FileTransfer.xml index 15bb82c75..620ce1055 100644 --- a/data/org.freedesktop.portal.FileTransfer.xml +++ b/data/org.freedesktop.portal.FileTransfer.xml @@ -63,6 +63,7 @@ Supported keys in the @options vardict include: * ``writable`` (``b``) + Whether to allow the chosen application to write to the files. This key only takes effect for files that need to be exported @@ -72,6 +73,7 @@ Default: False * ``autostop`` (``b``) + Whether to stop the transfer automatically after the first org.freedesktop.portal.FileTransfer.RetrieveFiles() call. diff --git a/data/org.freedesktop.portal.Screenshot.xml b/data/org.freedesktop.portal.Screenshot.xml index 46a2dd0fe..cfdf61ce6 100644 --- a/data/org.freedesktop.portal.Screenshot.xml +++ b/data/org.freedesktop.portal.Screenshot.xml @@ -48,9 +48,11 @@ more information about the @handle. * ``modal`` (``b``) + Whether the dialog should be modal. Default is yes. * ``interactive`` (``b``) + Hint whether the dialog should offer customization before taking a screenshot. Default is no. **Since version 2.** @@ -58,6 +60,7 @@ signal: * ``uri`` (``s``) + String containing the uri of the screenshot. --> @@ -76,6 +79,7 @@ Supported keys in the @options vardict include: * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. @@ -83,6 +87,7 @@ The following results get returned via the #org.freedesktop.portal.Request::Response signal: * ``color`` (``(ddd)``) + The color, RGB values in the range [0,1], in the sRGB color space. --> diff --git a/data/org.freedesktop.portal.Secret.xml b/data/org.freedesktop.portal.Secret.xml index df293ed1c..db7939ef6 100644 --- a/data/org.freedesktop.portal.Secret.xml +++ b/data/org.freedesktop.portal.Secret.xml @@ -61,11 +61,13 @@ Supported keys in the @options vardict include: * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. * ``token`` (``s``) + An opaque string returned by a previous org.freedesktop.portal.Secret.RetrieveSecret() call. --> diff --git a/data/org.freedesktop.portal.Settings.xml b/data/org.freedesktop.portal.Settings.xml index 9cf5b954f..a285c0f8d 100644 --- a/data/org.freedesktop.portal.Settings.xml +++ b/data/org.freedesktop.portal.Settings.xml @@ -30,6 +30,7 @@ Currently the interface provides the following keys: * ``org.freedesktop.appearance`` ``color-scheme`` (``u``) + Indicates the system's preferred color scheme. Supported values are: @@ -40,6 +41,7 @@ Unknown values should be treated as ``0`` (no preference). * ``org.freedesktop.appearance`` ``accent-color`` (``(ddd)``) + Indicates the system's preferred accent color as a tuple of RGB values in the sRGB color space, in the range [0,1]. Out-of-range RGB values should be treated as an unset accent color. diff --git a/data/org.freedesktop.portal.Wallpaper.xml b/data/org.freedesktop.portal.Wallpaper.xml index e01140e1e..5c8bd43e0 100644 --- a/data/org.freedesktop.portal.Wallpaper.xml +++ b/data/org.freedesktop.portal.Wallpaper.xml @@ -44,10 +44,12 @@ Supported keys in the @options vardict include: * ``show-preview`` (``b``) + Whether to show a preview of the picture. Note that the portal may decide to show a preview even if this option is not set. * ``set-on`` (``s``) + Where to set the wallpaper. Possible values are ``background``, ``lockscreen``, or ``both``. --> @@ -70,10 +72,12 @@ Supported keys in the @options vardict include: * ``show-preview`` (``b``) + Whether to show a preview of the picture. Note that the portal may decide to show a preview even if this option is not set. * ``set-on`` (``s``) + Where to set the wallpaper. Possible values are ``background``, ``lockscreen``, or ``both``. --> From 163409da44bf99d738e42e10ba874705588510bc Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Mon, 20 Nov 2023 10:55:44 -0300 Subject: [PATCH 25/82] doc: Port Global Shortcuts interface XML to rST --- ...org.freedesktop.portal.GlobalShortcuts.xml | 111 +++++++----------- 1 file changed, 43 insertions(+), 68 deletions(-) diff --git a/data/org.freedesktop.portal.GlobalShortcuts.xml b/data/org.freedesktop.portal.GlobalShortcuts.xml index 2d77e3654..00785e9d5 100644 --- a/data/org.freedesktop.portal.GlobalShortcuts.xml +++ b/data/org.freedesktop.portal.GlobalShortcuts.xml @@ -50,36 +50,26 @@ Creates a global shortcuts session. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - session_handle_token s - - A string that will be used as the last element of the session handle. Must be a valid - object path element. See the #org.freedesktop.portal.Session documentation for - more information about the session handle. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``session_handle_token`` (``s``) + + A string that will be used as the last element of the session handle. Must be a valid + object path element. See the org.freedesktop.portal.Session documentation for + more information about the session handle. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - session_handle o - - The session handle. An object path for the - #org.freedesktop.portal.Session object representing the created - session. - - - + + * ``session_handle`` (``o``) + + The session handle. An object path for the + org.freedesktop.portal.Session object representing the created + session. --> @@ -101,26 +91,19 @@ Each element of the @shortcuts array is a tuple composed of a shortcut id, and a vardict with the following keys: - - - description s - - User-readable text describing what the shortcut does. - - - - preferred_trigger s - - The preferred shortcut trigger, defined as described by the "shortcuts" - XDG specification. Optional. - - - + + * ``description`` (``s``) + + User-readable text describing what the shortcut does. + + * ``preferred_trigger`` (``s``) + + The preferred shortcut trigger, defined as described by the "shortcuts" + XDG specification. Optional. Supported keys in the @options vardict include: - - - handle_token s + + * ``handle_token`` s A string that will be used as the last element of the @handle. Must be a valid object path element. See the @@ -179,31 +162,23 @@ Lists all shortcuts. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the - @handle. Must be a valid object path element. See the - #org.freedesktop.portal.Request documentation for more - information about the @handle. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the + @handle. Must be a valid object path element. See the + #org.freedesktop.portal.Request documentation for more + information about the @handle. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - shortcuts a(sa{sv}) - - A list of shortcuts. - See the #org.freedesktop.portal.Request::Response signal of the - org.freedesktop.portal.GlobalShortcuts.BindShortcuts() method for - the list of supported properties of shortcuts. - - - + * ``shortcuts`` (``a(sa{sv})``) + + A list of shortcuts. + + See the #org.freedesktop.portal.Request::Response signal of the + org.freedesktop.portal.GlobalShortcuts.BindShortcuts() method for + the list of supported properties of shortcuts. --> From f7b4d6860ed141688b1db0d6f158f56f31e28121 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Mon, 20 Nov 2023 14:56:05 -0300 Subject: [PATCH 26/82] Port remaining portal interfaces from XML to rST --- data/org.freedesktop.background.Monitor.xml | 31 +- data/org.freedesktop.portal.Background.xml | 1 + data/org.freedesktop.portal.Clipboard.xml | 3 +- ...org.freedesktop.portal.GlobalShortcuts.xml | 53 +- data/org.freedesktop.portal.Inhibit.xml | 114 ++-- data/org.freedesktop.portal.InputCapture.xml | 360 ++++++------- data/org.freedesktop.portal.Location.xml | 136 ++--- data/org.freedesktop.portal.MemoryMonitor.xml | 4 +- .../org.freedesktop.portal.NetworkMonitor.xml | 43 +- data/org.freedesktop.portal.Notification.xml | 144 +++-- data/org.freedesktop.portal.OpenURI.xml | 157 +++--- data/org.freedesktop.portal.Print.xml | 506 +++++++----------- data/org.freedesktop.portal.ProxyResolver.xml | 6 +- data/org.freedesktop.portal.RemoteDesktop.xml | 258 ++++----- data/org.freedesktop.portal.ScreenCast.xml | 341 +++++------- data/org.freedesktop.portal.Screenshot.xml | 1 + 16 files changed, 891 insertions(+), 1267 deletions(-) diff --git a/data/org.freedesktop.background.Monitor.xml b/data/org.freedesktop.background.Monitor.xml index 1a2028a4e..b9d136240 100644 --- a/data/org.freedesktop.background.Monitor.xml +++ b/data/org.freedesktop.background.Monitor.xml @@ -36,26 +36,17 @@ The list of applications that are considered to be running in background. The following keys are supported: - - - app_id s - - App id of the application. - - - - instance s - - The Flatpak instance of the application. - - - - message s - - Status message reported by the application. Optional. - - - + * ``app_id`` (``s``) + + App id of the application. + + * ``instance`` (``s``) + + The Flatpak instance of the application. + + * ``message`` (``s``) + + Status message reported by the application. Optional. --> diff --git a/data/org.freedesktop.portal.Background.xml b/data/org.freedesktop.portal.Background.xml index 2ae9e7799..70aabdb0a 100644 --- a/data/org.freedesktop.portal.Background.xml +++ b/data/org.freedesktop.portal.Background.xml @@ -92,6 +92,7 @@ Supported keys in the @options vardict include: * ``message`` (``s``) + A string that will be used as the status message of the application. This should be a single line that can be presented to the user in a list, not a full sentence or paragraph. Must be shorter than 96 diff --git a/data/org.freedesktop.portal.Clipboard.xml b/data/org.freedesktop.portal.Clipboard.xml index 5b044aa17..46cf47fc1 100644 --- a/data/org.freedesktop.portal.Clipboard.xml +++ b/data/org.freedesktop.portal.Clipboard.xml @@ -90,8 +90,7 @@ SelectionWriteDone: @session_handle: Object path for the #org.freedesktop.portal.Session object @serial: The serial of the request where this answer is directed to - @success: A boolean which indicates whether the transfer of the clipboard - data was successful ('true') or not ('false') + @success: A boolean which indicates whether the transfer of the clipboard data was successful (``true``) or not (``false``) Notifies that the transfer of the clipboard data has either completed successfully, or failed. diff --git a/data/org.freedesktop.portal.GlobalShortcuts.xml b/data/org.freedesktop.portal.GlobalShortcuts.xml index 00785e9d5..fdbfe016a 100644 --- a/data/org.freedesktop.portal.GlobalShortcuts.xml +++ b/data/org.freedesktop.portal.GlobalShortcuts.xml @@ -103,45 +103,32 @@ Supported keys in the @options vardict include: - * ``handle_token`` s - - A string that will be used as the last element of the - @handle. Must be a valid object path element. See the - #org.freedesktop.portal.Request documentation for more - information about the @handle. - - - + * ``handle_token```` (``s``) + + A string that will be used as the last element of the + @handle. Must be a valid object path element. See the + #org.freedesktop.portal.Request documentation for more + information about the @handle. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - shortcuts a(sa{sv}) - - A list of shortcuts. The list of keys it may contain is described - below, and is different from the @shortcuts variable of this method. - - - + + * ``shortcuts a(sa{sv}) + + A list of shortcuts. The list of keys it may contain is described + below, and is different from the @shortcuts variable of this method. Each element of the @shortcuts array returned by the #org.freedesktop.portal.Request::Response signal is a tuple composed of a shortcut id, and a vardict with the following keys: - - - description s - - User-readable text describing what the shortcut does. - - - - trigger_description s - - User-readable text describing how to trigger the shortcut for the - client to render. - - - + + * ``description`` (``s``) + + User-readable text describing what the shortcut does. + + * ``trigger_description`` (``s``) + + User-readable text describing how to trigger the shortcut for the + client to render. --> diff --git a/data/org.freedesktop.portal.Inhibit.xml b/data/org.freedesktop.portal.Inhibit.xml index e91bd22d3..1c97a1de0 100644 --- a/data/org.freedesktop.portal.Inhibit.xml +++ b/data/org.freedesktop.portal.Inhibit.xml @@ -41,28 +41,23 @@ handle. The flags determine what changes are inhibited: - - 1: Logout - 2: User Switch - 4: Suspend - 8: Idle - + + - ``1``: Logout + - ``2``: User Switch + - ``4``: Suspend + - ``8``: Idle Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - reason s - User-visible reason for the inhibition. - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``reason`` (``s``) + + User-visible reason for the inhibition. --> @@ -87,36 +82,26 @@ #org.freedesktop.portal.Session::Closed. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - session_handle_token s - - A string that will be used as the last element of the session handle. Must be a valid - object path element. See the #org.freedesktop.portal.Session documentation for - more information about the session handle. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``session_handle_token`` (``s``) + + A string that will be used as the last element of the session handle. Must be a valid + object path element. See the #org.freedesktop.portal.Session documentation for + more information about the session handle. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - session_handle o - - The session handle. An object path for the - #org.freedesktop.portal.Session object representing the created - session. - - - + + * ``session_handle`` (``o``) + + The session handle. An object path for the + #org.freedesktop.portal.Session object representing the created + session. This method was added in version 2 of this interface. --> @@ -141,26 +126,19 @@ first to inhibit logout, to prevent the session from proceeding to the Ending state. The following information may get returned in the @state vardict: - - - screensaver-active b - - Whether the screensaver is active. - - - - session-state u - - The state of the session. This member is new in version 3. - - - 1: Running - 2: Query End - 3: Ending - - - - + + * ``screensaver-active`` (``b``) + + Whether the screensaver is active. + + * ``session-state`` (``u``) + + The state of the session. This member is new in version 3. + + - ``1``: Running + - ``2``: Query End + - ``3``: Ending + --> diff --git a/data/org.freedesktop.portal.InputCapture.xml b/data/org.freedesktop.portal.InputCapture.xml index b12ce9b27..621989e77 100644 --- a/data/org.freedesktop.portal.InputCapture.xml +++ b/data/org.freedesktop.portal.InputCapture.xml @@ -66,58 +66,44 @@ signalled via #org.freedesktop.portal.Session::Closed. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - session_handle_token s - - A string that will be used as the last element of the session handle. Must be a valid - object path element. See the #org.freedesktop.portal.Session documentation for - more information about the session handle. - - - - capabilities u - - Bitmask of requested capabilities, see the - SupportedCapabilities property. This value is required and must not be zero. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``session_handle_token`` (``s``) + + A string that will be used as the last element of the session handle. Must be a valid + object path element. See the #org.freedesktop.portal.Session documentation for + more information about the session handle. + + * ``capabilities`` (``u``) + + Bitmask of requested capabilities, see the SupportedCapabilities property. + This value is required and must not be zero. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - session_handle o - - The session handle. An object path for the - #org.freedesktop.portal.Session object representing the created - session. - - - - capabilities u - - The capabilities available to this session. This is always a - subset of the requested capabilities. - See the SupportedCapabilities property for details. Note that - while a capability may be available to a session, there is no - guarantee a device with that capability is currently available - or if one does become available that it will trigger input capture. - - It is best to view this set as a negative confirmation - a - capability that was requested but is missing is an indication that - this application may not capture events of that capability. - - - + + * ``session_handle`` (``o``) + + The session handle. An object path for the + #org.freedesktop.portal.Session object representing the created + session. + + * ``capabilities`` (``u``) + + The capabilities available to this session. This is always a + subset of the requested capabilities. + See the SupportedCapabilities property for details. Note that + while a capability may be available to a session, there is no + guarantee a device with that capability is currently available + or if one does become available that it will trigger input capture. + + It is best to view this set as a negative confirmation - a + capability that was requested but is missing is an indication that + this application may not capture events of that capability. --> @@ -163,25 +149,19 @@ wrapping detection. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - zones a(uuii) - - An array of regions, each specifying that zone's width, - height, x/y offset. - - - - zone_set u - - A unique ID to be used in the - org.freedesktop.portal.InputCapture.SetPointerBarriers() method to refer to - this set of zones. This id increases by an unspecified - amount whenever the zones change and pointer barriers can only be set up - if the zone_set matches the most recent returned zone_set. - - - + + * ``zones`` (``a(uuii)``) + + An array of regions, each specifying that zone's width, height, + x/y offset. + + * ``zone_set`` (``u``) + + A unique ID to be used in the + org.freedesktop.portal.InputCapture.SetPointerBarriers() method to refer to + this set of zones. This id increases by an unspecified + amount whenever the zones change and pointer barriers can only be set up + if the zone_set matches the most recent returned zone_set. --> @@ -216,14 +196,12 @@ 0,0 and 1920,0, respectively. (i.e. a left-right dual-monitor setup). The following pointer barriers are permitted: - - top edge of left screen: x1=0,y1=0,x2=1919,y1=0 - bottom edge of left screen: x1=0,y1=1080,x2=1919,y1=1080 - top edge of right screen: x1=1920,y1=0,x2=3839,y1=0 - bottom edge of right screen: x1=1920,y1=1080,x2=3839,y1=1080 - left edge of left screen: x1=0,y1=0,x2=0,y1=1079 - right edge of right screen: x1=3840,y1=0,x2=3840,y1=1079 - + - top edge of left screen: `x1=0, y1=0, x2=1919, y1=0` + - bottom edge of left screen: `x1=0, y1=1080, x2=1919, y1=1080` + - top edge of right screen: `x1=1920, y1=0, x2=3839, y1=0` + - bottom edge of right screen: `x1=1920, y1=1080, x2=3839, y1=1080` + - left edge of left screen: `x1=0, y1=0, x2=0, y1=1079` + - right edge of right screen: `x1=3840, y1=0, x2=3840, y1=1079` A pointer barrier is considered triggered when the pointer would logically move off that zone, even if the actual cusor movement is @@ -240,47 +218,33 @@ pointer barriers will fail. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. Supported keys in the @barriers vardicts include: - - - barrier_id u - - The non-zero id of this barrier. This id is used in the - #org.freedesktop.portal.InputCapture::Activated signal to inform - which barrier triggered input capture. - - - - position (iiii) - - The x1/y1 x2/y2 position of the pointer barrier. A horizontal - pointer barrier must have y1 == y2, a vertical pointer barrier - must have x1 == x2. Diagonal pointer barriers are not supported. - - - + + * ``barrier_id`` (``u``) + + The non-zero id of this barrier. This id is used in the + #org.freedesktop.portal.InputCapture::Activated signal to inform + which barrier triggered input capture. + + * ``position`` (``(iiii)``) + + The x1/y1 x2/y2 position of the pointer barrier. A horizontal + pointer barrier must have y1 == y2, a vertical pointer barrier + must have x1 == x2. Diagonal pointer barriers are not supported. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - failed_barriers au - - An array of barrier_ids of pointer barriers that have been denied. The - id matches the barrier_id of the entries in the @barriers argument. - - - + + * ``failed_barriers`` (``au``) + + An array of barrier_ids of pointer barriers that have been denied. The + id matches the barrier_id of the entries in the @barriers argument. --> @@ -356,26 +320,20 @@ activation_id. Supported keys in the @options vardict include: - - - activation_id u - - The same activation_id number as in the - #org.freedesktop.portal.InputCapture::Activated signal. - - - - cursor_position (dd) - - The suggested cursor position within the Zones available in - this session. - - This is a suggestion to the compositor to place the cursor in - the correct position to allow for fluent movement between virtual - screens. The compositor is not required to honor this suggestion. - - - + + * ``activation_id`` (``u``) + + The same activation_id number as in the + #org.freedesktop.portal.InputCapture::Activated signal. + + * ``cursor_position`` (``(dd)``) + + The suggested cursor position within the Zones available in + this session. + + This is a suggestion to the compositor to place the cursor in + the correct position to allow for fluent movement between virtual + screens. The compositor is not required to honor this suggestion. --> @@ -434,59 +392,51 @@ to org.freedesktop.portal.InputCapture.Enable(). Supported keys in the @options vardict include: - - - activation_id u - - A number that can be used to synchronize with the - transport-layer. This number has no intrinsic meaning but - is guaranteed to increase by an unspecified amount on each call. - - In particular: if the compositor sends a activation_id of N as - part of this request it will also set the sequence in EIS' - start_emulating event the same value N on the EIS connection - before the first event from a device is sent. - This allows an application to have a synchronization point and - attribute an event sequence to the portal interaction. - - Applications must be able to handle the activation_id number - wrapping around. Implementations of this portal must increase - the activation_id number by a sensible amount to allow for - wrapping detection. - - - - cursor_position (dd) - - The current cursor position in the same coordinate space as - the Zones. Note that this position is usually outside the Zones - available to this session as all PointerBarriers are at the edge - of their respective Zones. - - For example, a fast movement against a barrier on the right edge - of a screen may logically put the cursor dozens of pixels into - the (non-existing) screen on the other side of the barrier. - It is the application's responsibility to calculate and adjust the - cursor position as necessary. - - - - barrier_id u - - The barrier id of the barrier that triggered. If the value is - nonzero, it matches the barrier id as specified in - org.freedesktop.portal.InputCapture.SetPointerBarriers(). - - If the id is zero, the pointer barrier could not be determined. - If the id is missing, the input capture was not triggered by a - pointer barrier. - - Where more than one pointer barrier are triggered by the same - movement it is up to the compositor to choose one barrier (or use - a barrier id of zero). - - - + + * ``activation_id`` (``u``) + + A number that can be used to synchronize with the + transport-layer. This number has no intrinsic meaning but + is guaranteed to increase by an unspecified amount on each call. + + In particular: if the compositor sends a activation_id of N as + part of this request it will also set the sequence in EIS' + start_emulating event the same value N on the EIS connection + before the first event from a device is sent. + This allows an application to have a synchronization point and + attribute an event sequence to the portal interaction. + + Applications must be able to handle the activation_id number + wrapping around. Implementations of this portal must increase + the activation_id number by a sensible amount to allow for + wrapping detection. + + * ``cursor_position`` (``(dd)``) + + The current cursor position in the same coordinate space as + the Zones. Note that this position is usually outside the Zones + available to this session as all PointerBarriers are at the edge + of their respective Zones. + + For example, a fast movement against a barrier on the right edge + of a screen may logically put the cursor dozens of pixels into + the (non-existing) screen on the other side of the barrier. + It is the application's responsibility to calculate and adjust the + cursor position as necessary. + + * ``barrier_id`` (``u``) + + The barrier id of the barrier that triggered. If the value is + nonzero, it matches the barrier id as specified in + org.freedesktop.portal.InputCapture.SetPointerBarriers(). + + If the id is zero, the pointer barrier could not be determined. + If the id is missing, the input capture was not triggered by a + pointer barrier. + + Where more than one pointer barrier are triggered by the same + movement it is up to the compositor to choose one barrier (or use + a barrier id of zero). --> @@ -503,15 +453,11 @@ capture, an application must call org.freedesktop.portal.InputCapture.Disable(). Supported keys in the @options vardict include: - - - activation_id u - - The same activation_id number as in the corresponding - #org.freedesktop.portal.InputCapture::Activated signal. - - - + + * ``activation_id`` (``u``) + + The same activation_id number as in the corresponding + #org.freedesktop.portal.InputCapture::Activated signal. --> @@ -540,15 +486,11 @@ discard the signal. Supported keys in the @options vardict include: - - - zone_set u - - The zone_set ID of the invalidated zone set as described in - org.freedesktop.portal.InputCapture.GetZones() - - - + + * ``zone_set`` (``u``) + + The zone_set ID of the invalidated zone set as described in + org.freedesktop.portal.InputCapture.GetZones() --> @@ -566,11 +508,9 @@ Currently defined types are: - - 1: KEYBOARD - 2: POINTER - 4: TOUCHSCREEN - + - ``1``: KEYBOARD + - ``2``: POINTER + - ``4``: TOUCHSCREEN --> diff --git a/data/org.freedesktop.portal.Location.xml b/data/org.freedesktop.portal.Location.xml index 35b40f385..082a6c689 100644 --- a/data/org.freedesktop.portal.Location.xml +++ b/data/org.freedesktop.portal.Location.xml @@ -40,35 +40,31 @@ signalled via #org.freedesktop.portal.Session::Closed. Supported keys in the @options vardict include: - - - session_handle_token s - + + * ``session_handle_token`` (``s``) + A string that will be used as the last element of the session handle. Must be a valid object path element. See the #org.freedesktop.portal.Session documentation for more information about the session handle. - - - - distance-threshold u - - Distance threshold in meters. Default is 0. - - - - time-threshold u - - Time threshold in seconds. Default is 0. - - - - accuracy u - - Requested accuracy. Default is EXACT. - Values: NONE 0, COUNTRY 1, CITY 2, NEIGHBORHOOD 3, STREET 4, EXACT 5 - - - + + * ``distance-threshold`` (``u``) + + Distance threshold in meters. Default is 0. + + * ``time-threshold`` (``u``) + + Time threshold in seconds. Default is 0. + + * ``accuracy`` (``u``) + + Requested accuracy. Default is ``EXACT``. Supported values: + + - ``NONE``: 0 + - ``COUNTRY``: 1 + - ``CITY``: 2 + - ``NEIGHBORHOOD``: 3 + - ``STREET``: 4 + - ``EXACT``: 5 --> @@ -86,16 +82,12 @@ An application can only attempt start a session once. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. --> @@ -113,50 +105,34 @@ as when the initial location has been determined. The following results may get returned via the @location: - - - Latitude d - - The latitude, in degrees. - - - - Longitude d - - The longitude, in degrees. - - - - Altitude d - - The altitude, in meters. - - - - Accuracy d - - The accuracy, in meters. - - - - Speed d - - The speed, in meters per second. - - - - Heading d - - The heading, in degrees, going clockwise. North 0, East 90, South 180, West 270. - - - - Timestamp (tt) - - The timestamp, as seconds and microseconds since the Unix epoch. - - - + + * ``Latitude`` (``d``) + + The latitude, in degrees. + + * ``Longitude`` (``d``) + + The longitude, in degrees. + + * ``Altitude`` (``d``) + + The altitude, in meters. + + * ``Accuracy`` (``d``) + + The accuracy, in meters. + + * ``Speed`` (``d``) + + The speed, in meters per second. + + * ``Heading`` (``d``) + + The heading, in degrees, going clockwise. North 0, East 90, South 180, West 270. + + * ``Timestamp`` (``(tt)``) + + The timestamp, as seconds and microseconds since the Unix epoch. --> diff --git a/data/org.freedesktop.portal.MemoryMonitor.xml b/data/org.freedesktop.portal.MemoryMonitor.xml index c347581f1..bd40bcce3 100644 --- a/data/org.freedesktop.portal.MemoryMonitor.xml +++ b/data/org.freedesktop.portal.MemoryMonitor.xml @@ -38,8 +38,8 @@ Signal emitted when a particular low memory situation happens with 0 being the lowest level of memory availability warning, and 255 being the highest. Those levels are defined - and documented in - Low Memory Monitor's documentation. + and documented in `Low Memory Monitor's documentation + `_. --> diff --git a/data/org.freedesktop.portal.NetworkMonitor.xml b/data/org.freedesktop.portal.NetworkMonitor.xml index 5359b0c2f..da54d812d 100644 --- a/data/org.freedesktop.portal.NetworkMonitor.xml +++ b/data/org.freedesktop.portal.NetworkMonitor.xml @@ -72,12 +72,11 @@ Returns more detailed information about the host's network connectivity. The meaning of the value is: - - 1: Local only. The host is not configured with a route to the internet. - 2: Limited connectivity. The host is connected to a network, but can't reach the full internet. - 3: Captive portal. The host is behind a captive portal and cannot reach the full internet. - 4: Full network. The host connected to a network, and can reach the full internet. - + + - ``1``: Local only. The host is not configured with a route to the internet. + - ``2``: Limited connectivity. The host is connected to a network, but can't reach the full internet. + - ``3``: Captive portal. The host is behind a captive portal and cannot reach the full internet. + - ``4``: Full network. The host connected to a network, and can reach the full internet. This method was added in version 2 to replace the connectivity property. @@ -92,26 +91,18 @@ Returns the three values all at once. The following results get returned via @status: - - - available b - - Whether the network is available. - - - - metered b - - Whether the network is metered. - - - - connectivity u - - The level of connectivity. - - - + + * ``available`` (``b``) + + Whether the network is available. + + * ``metered`` (``b``) + + Whether the network is metered. + + * ``connectivity`` (``u``) + + The level of connectivity. This method was added in version 3 to avoid multiple round-trips. --> diff --git a/data/org.freedesktop.portal.Notification.xml b/data/org.freedesktop.portal.Notification.xml index 5d91fb908..1c068b6dc 100644 --- a/data/org.freedesktop.portal.Notification.xml +++ b/data/org.freedesktop.portal.Notification.xml @@ -57,87 +57,66 @@ The format of the serialized notification is a vardict, with the following supported keys, all of which are optional: - - - title s - - User-visible string to display as the title. - - - - body s - - User-visible string to display as the body. - - - - icon v - - Serialized icon (see g_icon_serialize()). - - The portal only accepts serialized GThemedIcon and GBytesIcons. Both of - these have the form (sv). For themed icons, the string is "themed", - and the value is an array of strings containing the icon names. - For bytes icons, the string is "bytes", and the value is a bytestring - containing the icon data in png, jpeg or svg form. For historical - reasons, it is also possible to send a simple string for themed - icons with a single icon name. - - - There may be further restrictions on the supported kinds of icons. - - - - priority s - - The priority for the notification. Supported values: low, normal, - high, urgent. - - - - default-action s - - Name of an action that is exported by the application. This - action will be activated when the user clicks on the notification. - - - - default-action-target v - - Target parameter to send along when activating the default action. - - - - buttons aa{sv} - - Array of serialized buttons to add to the notification. - - - - - The format for serialized buttons is a vardict with the following supported keys: - - - label s - - User-visible label for the button. Mandatory. - - - - action s - - Name of an action that is exported by the application. The action - will be activated when the user clicks on the button. Mandatory. - - - - target v - - Target parameter to send along when activating the action. - - - - --> + + * ``title`` (``s``) + + User-visible string to display as the title. + + * ``body`` (``s``) + + User-visible string to display as the body. + + * ``icon`` (``v``) + + Serialized icon (see `g_icon_serialize() + `_). + + The portal only accepts serialized GThemedIcon and GBytesIcons. Both of + these have the form (sv). For themed icons, the string is "themed", + and the value is an array of strings containing the icon names. + For bytes icons, the string is "bytes", and the value is a bytestring + containing the icon data in png, jpeg or svg form. For historical + reasons, it is also possible to send a simple string for themed + icons with a single icon name. + + There may be further restrictions on the supported kinds of icons. + + * ``priority`` (``s``) + + The priority for the notification. Supported values: + + - ``low`` + - ``normal`` + - ``high`` + - ``urgent`` + + * ``default-action`` (``s``) + + Name of an action that is exported by the application. This + action will be activated when the user clicks on the notification. + + * ``default-action-target`` (``v``) + + Target parameter to send along when activating the default action. + + * ``buttons`` (``aa{sv}``) + + Array of serialized buttons to add to the notification. The format for + serialized buttons is a vardict with the following supported keys: + + * ``label`` (``s``) + + User-visible label for the button. Mandatory. + + * ``action`` (``s``) + + Name of an action that is exported by the application. The action + will be activated when the user clicks on the button. Mandatory. + + * ``target`` (``v``) + + Target parameter to send along when activating the action. + --> @@ -156,8 +135,7 @@ ActionInvoked: @id: the application-provided ID for the notification @action: the name of the action - @parameter: array which will contain the target parameter - for the action, if one was specified + @parameter: array which will contain the target parameter for the action, if one was specified Send to the application when a non-exported action is activated. diff --git a/data/org.freedesktop.portal.OpenURI.xml b/data/org.freedesktop.portal.OpenURI.xml index 0c420291d..33a029ee7 100644 --- a/data/org.freedesktop.portal.OpenURI.xml +++ b/data/org.freedesktop.portal.OpenURI.xml @@ -43,44 +43,33 @@ To request opening local files, use org.freedesktop.portal.OpenURI.OpenFile(). Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - writable b - - Whether to allow the chosen application to write to the file. - - This key only takes effect the uri points to a local file that - is exported in the document portal, and the chosen application - is sandboxed itself. - - - - ask b - - Whether to ask the user to choose an app. If this is not passed, or false, - the portal may use a default or pick the last choice. - - The ask option was introduced in version 3 of the interface. - - - - activation_token s - - A token that can be used to activate the chosen application. - - The activation_token option was introduced in version 4 of the interface. - - - + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``writable`` (``b``) + + Whether to allow the chosen application to write to the file. + + This key only takes effect the uri points to a local file that + is exported in the document portal, and the chosen application + is sandboxed itself. + + * ``ask`` (``b``) + + Whether to ask the user to choose an app. If this is not passed, or false, + the portal may use a default or pick the last choice. + + The ask option was introduced in version 3 of the interface. + + * ``activation_token`` (``s``) + + A token that can be used to activate the chosen application. + + The activation_token option was introduced in version 4 of the interface. --> @@ -99,43 +88,33 @@ Asks to open a local file. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - writable b - - Whether to allow the chosen application to write to the file. - - This key only takes effect the uri points to a local file that - is exported in the document portal, and the chosen application - is sandboxed itself. - - - - ask b - - Whether to ask the user to choose an app. If this is not passed, or false, - the portal may use a default or pick the last choice. - - The ask option was introduced in version 3 of the interface. - - - - activation_token s - - A token that can be used to activate the chosen application. - - The activation_token option was introduced in version 4 of the interface. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``writable`` (``b``) + + Whether to allow the chosen application to write to the file. + + This key only takes effect the uri points to a local file that is + exported in the document portal, and the chosen application is + sandboxed itself. + + * ``ask`` (``b``) + + Whether to ask the user to choose an app. If this is not passed, or false, + the portal may use a default or pick the last choice. + + The ask option was introduced in version 3 of the interface. + + * ``activation_token`` (``s``) + + A token that can be used to activate the chosen application. + + The activation_token option was introduced in version 4 of the interface. The OpenFile method was introduced in version 2 of the OpenURI portal API. --> @@ -157,24 +136,18 @@ Asks to open the directory containing a local file in the file browser. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - activation_token s - - A token that can be used to activate the chosen application. - - The activation_token option was introduced in version 4 of the interface. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``activation_token`` (``s``) + + A token that can be used to activate the chosen application. + + The activation_token option was introduced in version 4 of the interface. The OpenDirectory method was introduced in version 3 of the OpenURI portal API. --> diff --git a/data/org.freedesktop.portal.Print.xml b/data/org.freedesktop.portal.Print.xml index f6b76895c..e421c6239 100644 --- a/data/org.freedesktop.portal.Print.xml +++ b/data/org.freedesktop.portal.Print.xml @@ -57,28 +57,20 @@ it considers tokens valid. Supported keys in the @options vardict: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - modal b - - Whether to make the dialog modal. Defaults to yes. - - - - token u - - Token that was returned by a previous org.freedesktop.portal.Print.PreparePrint() call. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``modal`` (``b``) + + Whether to make the dialog modal. Defaults to yes. + + * ``token`` (``u``) + + Token that was returned by a previous org.freedesktop.portal.Print.PreparePrint() call. --> @@ -101,289 +93,197 @@ and page setup. Supported keys in the @options vardict: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - modal b - - Whether to make the dialog modal. Defaults to yes. - - - - accept_label s - - Label for the accept button. Mnemonic underlines are allowed. - - This option was added in version 2. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``modal`` (``b``) + + Whether to make the dialog modal. Defaults to yes. + + * ``accept_label`` (``s``) + + Label for the accept button. Mnemonic underlines are allowed. + + This option was added in version 2. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - settings a{sv} - - Print settings as set up by the user in the print dialog. - - - - page-setup a{sv} - - Page setup as set up by the user in the print dialog. - - - - token u - - Token that can be passed to a subsequent org.freedesktop.portal.Print.Print() call to - bypass the print dialog. - - - - - The following keys are supported in the print settings vardict: - - - orientation s - - One of landscape, portrait, reverse_landscape or reverse_portrait. - - - - paper-format s - - A paper name according to PWG 5101.1-2002. - - - - paper-width s - - Paper width, in millimeters. - - - - paper-height s - - Paper height, in millimeters. - - - - n-copies s - - The number of copies to print. - - - - default-source s - - The default paper source. - - - - quality s - - Print quality, one of normal, high, low or draft. - - - - resolution s - - The resolution, sets both resolution-x and resolution-y. - - - - use-color s - - Whether to use color, one of true or false. - - - - duplex s - - Duplex printing mode, one of simplex, horizontal or vertical. - - - - collate s - - Whether to collate copies, one of true or false. - - - - reverse s - - Whether to reverse the order of printed pages, one of true or false. - - - - media-type s - - A media type according to PWG 5101.1-2002. - - - - dither s - - The dithering to use, one of fine, none, coarse, lineart, grayscale or error-diffusion. - - - - scale s - - The scale in percent. - - - - print-pages s - - What pages to print, one of all, selection, current or ranges. - - - - page-ranges s - - A list of page ranges, formatted like this: 0-2,4,9-11. - - Note that page ranges are 0-based, even if the are displayed as 1-based when presented to the user. - - - - page-set s - - What pages to print, one of all, even or odd. - - - - finishings s - - - - - number-up s - - The number of pages per sheet. - - - - number-up-layout s - - One of lrtb, lrbt, rltb, rlbt, tblr, tbrl, btlr, btrl. - - - - output-bin s - - - - - resolution-x s - - The horizontal resolution in dpi. - - - - resolution-y s - - The vertical resolution in dpi. - - - - printer-lpi s - - The resolution in lpi (lines per inch). - - - - output-basename s - - Basename to use for print-to-file. - - - - output-file-format s - - Format to use for print-to-file, one of PDF, PS, SVG. - - - - output-uri s - - The uri used for print-to-file. - - - - - The following keys are supported in the page setup vardict: - - - PPDName s - - The PPD name. - - - - Name s - - The name of the page setup. - - - - DisplayName s - - User-visible name for the page setup. - - - - Width d - - Paper width in millimeters. - - - - Height d - - Paper height in millimeters. - - - - MarginTop d - - Top margin in millimeters. - - - - MarginBottom d - - Bottom margin in millimeters. - - - - MarginLeft d - - Left margin in millimeters. - - - - MarginRight d - - Right margin in millimeters. - - - - Orientation s - - Orientation, one of portrait, landscape, reverse-portrait or reverse-landscape. - - - + + * ``settings`` (``a{sv}``) + + Print settings as set up by the user in the print dialog. + + The following keys are supported in the print settings vardict: + + * ``orientation`` (``s``) + + One of ``landscape``, ``portrait``, ``reverse_landscape`` or ``reverse_portrait``. + + * ``paper-format`` (``s``) + + A paper name according to `PWG 5101.1-2002 `_. + + * ``paper-width`` (``s``) + + Paper width, in millimeters. + + * ``paper-height`` (``s``) + + Paper height, in millimeters. + + * ``n-copies`` (``s``) + + The number of copies to print. + + * ``default-source`` (``s``) + + The default paper source. + + * ``quality`` (``s``) + + Print quality, one of normal, high, low or draft. + + * ``resolution`` (``s``) + + The resolution, sets both resolution-x and resolution-y. + + * ``use-color`` (``s``) + + Whether to use color, one of true or false. + + * ``duplex`` (``s``) + + Duplex printing mode, one of simplex, horizontal or vertical. + + * ``collate`` (``s``) + + Whether to collate copies, one of true or false. + + * ``reverse`` (``s``) + + Whether to reverse the order of printed pages, one of true or false. + + * ``media-type`` (``s``) + + A media type according to `PWG 5101.1-2002 `_. + + * ``dither`` (``s``) + + The dithering to use, one of ``fine``, ``none``, ``coarse``, + ``lineart``, ``grayscale`` or ``error-diffusion``. + + * ``scale`` (``s``) + + The scale in percent. + + * ``print-pages`` (``s``) + + What pages to print, one of all, selection, current or ranges. + + * ``page-ranges`` (``s``) + + A list of page ranges, formatted like this: `0-2,4,9-11`. + + .. note:: + + Page ranges are 0-based, even if the are displayed as 1-based when presented to the user. + + * ``page-set`` (``s``) + + What pages to print, one of all, even or odd. + + * ``finishings`` (``s``) + + Finishings. + + * ``number-up`` (``s``) + + The number of pages per sheet. + + * ``number-up-layout`` (``s``) + + One of ``lrtb``, ``lrbt``, ``rltb``, ``rlbt``, ``tblr``, ``tbrl``, + ``btlr``, ``btrl``. + + * ``output-bin`` (``s``) + + * ``resolution-x`` (``s``) + + The horizontal resolution in dpi. + + * ``resolution-y`` (``s``) + + The vertical resolution in dpi. + + * ``printer-lpi`` (``s``) + + The resolution in lpi (lines per inch). + + * ``output-basename`` (``s``) + + Basename to use for print-to-file. + + * ``output-file-format`` (``s``) + + Format to use for print-to-file, one of PDF, PS, SVG. + + * ``output-uri`` (``s``) + + The uri used for print-to-file. + + * ``page-setup`` (``a{sv}``) + + Page setup as set up by the user in the print dialog. + + The following keys are supported in the page setup vardict: + + * ``PPDName`` (``s``) + + The PPD name. + + * ``Name`` (``s``) + + The name of the page setup. + + * ``DisplayName`` (``s``) + + User-visible name for the page setup. + + * ``Width`` (``d``) + + Paper width in millimeters. + + * ``Height`` (``d``) + + Paper height in millimeters. + + * ``MarginTop`` (``d``) + + Top margin in millimeters. + + * ``MarginBottom`` (``d``) + + Bottom margin in millimeters. + + * ``MarginLeft`` (``d``) + + Left margin in millimeters. + + * ``MarginRight`` (``d``) + + Right margin in millimeters. + + * ``Orientation`` (``s``) + + Orientation, one of portrait, landscape, reverse-portrait or reverse-landscape. + + * ``token`` (``u``) + + Token that can be passed to a subsequent org.freedesktop.portal.Print.Print() call to + bypass the print dialog. --> diff --git a/data/org.freedesktop.portal.ProxyResolver.xml b/data/org.freedesktop.portal.ProxyResolver.xml index 4b39fc078..f0f4f9b65 100644 --- a/data/org.freedesktop.portal.ProxyResolver.xml +++ b/data/org.freedesktop.portal.ProxyResolver.xml @@ -36,9 +36,9 @@ @proxies: List of proxy uris Looks up which proxy to use to connect to @uri. The returned - proxy uri are of the form 'protocol://[user[:password]@host:port'. - The protocol can be http, rtsp, socks or another proxying protocol. - 'direct://' is used when no proxy is needed. + proxy uri are of the form ``protocol://[user[:password] AT host:port``. + The protocol can be ``http``, ``rtsp``, ``socks`` or another proxying + protocol. ``direct://`` is used when no proxy is needed. --> diff --git a/data/org.freedesktop.portal.RemoteDesktop.xml b/data/org.freedesktop.portal.RemoteDesktop.xml index 9ef6671a0..cc71aa7cf 100644 --- a/data/org.freedesktop.portal.RemoteDesktop.xml +++ b/data/org.freedesktop.portal.RemoteDesktop.xml @@ -49,36 +49,27 @@ integration. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - session_handle_token s - - A string that will be used as the last element of the session handle. Must be a valid - object path element. See the #org.freedesktop.portal.Session documentation for - more information about the session handle. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``session_handle_token`` (``s``) + + A string that will be used as the last element of the session handle. Must be a valid + object path element. See the #org.freedesktop.portal.Session documentation for + more information about the session handle. + The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - session_handle o - - The session handle. An object path for the - #org.freedesktop.portal.Session object representing the created - session. - - - + + * ``session_handle`` (``o``) + + The session handle. An object path for the + #org.freedesktop.portal.Session object representing the created + session. --> @@ -93,58 +84,46 @@ Select input devices to remote control. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - types u - - Bitmask of what device types to request remote controlling of. - Default is all. - - - - restore_token s - - The token to restore a previous session. - - If the stored session cannot be restored, this value is ignored - and the user will be prompted normally. This may happen when, for - example, the session contains a monitor or a window that is not - available anymore, or when the stored permissions are withdrawn. - - The restore token is invalidated after using it once. To restore - the same session again, use the new restore token sent in response - to starting this session. - - This option was added in version 2 of this interface. - - - - persist_mode u - - How this session should persist. Default is 0. Accepted values are: - - - 0: Do not persist (default) - 1: Permissions persist as long as the application is running - 2: Permissions persist until explicitly revoked - - - If the permission for the session to persist is granted, a restore token will - be returned via the #org.freedesktop.portal.Request::Response signal of the - start method used to start the session. - - This option was added in version 2 of this interface. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``types`` (``u``) + + Bitmask of what device types to request remote controlling of. + Default is all. + + * ``restore_token`` (``s``) + + The token to restore a previous session. + + If the stored session cannot be restored, this value is ignored + and the user will be prompted normally. This may happen when, for + example, the session contains a monitor or a window that is not + available anymore, or when the stored permissions are withdrawn. + + The restore token is invalidated after using it once. To restore + the same session again, use the new restore token sent in response + to starting this session. + + This option was added in version 2 of this interface. + + * ``persist_mode`` (``u``) + + How this session should persist. Default is 0. Accepted values are: + + - ``0``: Do not persist (default) + - ``1``: Permissions persist as long as the application is running + - ``2``: Permissions persist until explicitly revoked + + If the permission for the session to persist is granted, a restore token will + be returned via the #org.freedesktop.portal.Request::Response signal of the + start method used to start the session. + + This option was added in version 2 of this interface. For available device types, see the AvailableDeviceTypes property. --> @@ -166,45 +145,33 @@ selected. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - devices u - - A bitmask of the devices selected by the user. - - - - clipboard_enabled b - - A boolean for whether the clipboard was enabled ('true') or not ('false'). - See the #org.freedesktop.portal.Clipboard documentation for more information. - Since version 2. - - - - restore_token s - - The restore token. This token is a single use token that can later - be used to restore a session. See - org.freedesktop.portal.RemoteDesktop.SelectDevices() for details. - - This response option was added in version 2 of this interface. - - - + + * ``devices`` (``u``) + + A bitmask of the devices selected by the user. + + * ``clipboard_enabled`` (``b``) + + A boolean for whether the clipboard was enabled ('true') or not ('false'). + See the #org.freedesktop.portal.Clipboard documentation for more information. + Since version 2. + + * ``restore_token`` (``s``) + + The restore token. This token is a single use token that can later + be used to restore a session. See + org.freedesktop.portal.RemoteDesktop.SelectDevices() for details. + + This response option was added in version 2 of this interface. If a screen cast source was selected, the results of the #org.freedesktop.portal.ScreenCast.Start response signal may be @@ -266,10 +233,9 @@ session. Available button states: - - 0: Released - 1: Pressed - + + - ``0``: Released + - ``1``: Pressed --> @@ -292,16 +258,12 @@ session. Supported keys in the @options vardict include: - - - finish b - - If set to true, this is the last axis event in a series, for - example as a result of the fingers being lifted from a touchpad - after a two-finger scroll. Default is false. - - - + + * ``finish`` (``b``) + + If set to true, this is the last axis event in a series, for + example as a result of the fingers being lifted from a touchpad + after a two-finger scroll. Default is false. --> @@ -320,10 +282,10 @@ session. Available axes: - - 0: Vertical scroll - 1: Horizontal scroll - + + - ``0``: Vertical scroll + - ``1``: Horizontal scroll + --> @@ -342,10 +304,9 @@ session. Available keyboard keycode states: - - 0: Released - 1: Pressed - + + - ``0``: Released + - ``1``: Pressed --> @@ -364,10 +325,9 @@ session. Available keyboard keysym states: - - 0: Released - 1: Pressed - + + - ``0``: Released + - ``1``: Pressed --> @@ -456,15 +416,15 @@ This method may only be called once per session, where the EIS implementation disconnects the session should be closed. - This method must be called after #org.freedesktop.portal.RemoteDesktop.Start() + This method must be called after org.freedesktop.portal.RemoteDesktop.Start() Once an EIS connection is established, input events must be sent exclusively via the EIS connection. Any events submitted via NotifyPointerMotion, NotifyKeyboardKeycode and other Notify* methods will return an error. To see how to pair a PipeWire stream with a libei device region, see the - documentation for the mapping_id stream property in - #org.freedesktop.portal.RemoteDesktop.Start(). + documentation for the ``mapping_id`` stream property in + org.freedesktop.portal.RemoteDesktop.Start(). This method was added in version 2 of this interface. --> @@ -481,11 +441,9 @@ A bitmask of available source types. Currently defined types are: - - 1: KEYBOARD - 2: POINTER - 4: TOUCHSCREEN - + - ``1``: KEYBOARD + - ``2``: POINTER + - ``4``: TOUCHSCREEN --> diff --git a/data/org.freedesktop.portal.ScreenCast.xml b/data/org.freedesktop.portal.ScreenCast.xml index 7be37d600..893705d3a 100644 --- a/data/org.freedesktop.portal.ScreenCast.xml +++ b/data/org.freedesktop.portal.ScreenCast.xml @@ -37,36 +37,26 @@ signalled via #org.freedesktop.portal.Session::Closed. Supported keys in the @options vardict include: - - - handle_token s - + + * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. - - - - session_handle_token s - + + * ``session_handle_token`` (``s``) + A string that will be used as the last element of the session handle. Must be a valid object path element. See the #org.freedesktop.portal.Session documentation for more information about the session handle. - - - The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - session_handle o - + + * ``session_handle`` (``o``) + The session handle. An object path for the #org.freedesktop.portal.Session object representing the created session. - - - --> @@ -86,83 +76,67 @@ session. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - - types u - - Bitmask of what types of content to record. Default is MONITOR. - - - - multiple b - - Whether to allow selecting multiple sources. Default is no. - - - - cursor_mode u - - Determines how the cursor will be drawn in the screen cast stream. It must be - one of the cursor modes advertised in - #org.freedesktop.portal.ScreenCast.AvailableCursorModes. Setting a cursor mode - not advertised will cause the screen cast session to be closed. The default - cursor mode is 'Hidden'. - - This option was added in version 2 of this interface. - - - - restore_token s - - The token to restore a previous session. - - If the stored session cannot be restored, this value is ignored - and the user will be prompted normally. This may happen when, for - example, the session contains a monitor or a window that is not - available anymore, or when the stored permissions are withdrawn. - - The restore token is invalidated after using it once. To restore - the same session again, use the new restore token sent in response - to starting this session. - - Setting a restore_token is only allowed for screen cast sessions. - Persistent remote desktop screen cast sessions can only be handled - via the #org.freedesktop.portal.RemoteDesktop interface. - - This option was added in version 4 of this interface. - - - - persist_mode u - - How this session should persist. Default is 0. Accepted values are: - - - 0: Do not persist (default) - 1: Permissions persist as long as the application is running - 2: Permissions persist until explicitly revoked - - - Setting persist_mode is only allowed for screen cast sessions. Persistent - remote desktop screen cast sessions can only be handled via the - #org.freedesktop.portal.RemoteDesktop interface. - - If the permission for the session to persist is granted, a restore token will - be returned via the #org.freedesktop.portal.Request::Response signal of the - #org.freedesktop.portal.ScreenCast.Start method. - - This option was added in version 4 of this interface. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. + + * ``types`` (``u``) + + Bitmask of what types of content to record. Default is MONITOR. + + * ``multiple`` (``b``) + + Whether to allow selecting multiple sources. Default is no. + + * ``cursor_mode`` (``u``) + + Determines how the cursor will be drawn in the screen cast stream. It must be + one of the cursor modes advertised in + #org.freedesktop.portal.ScreenCast.AvailableCursorModes. Setting a cursor mode + not advertised will cause the screen cast session to be closed. The default + cursor mode is 'Hidden'. + + This option was added in version 2 of this interface. + + * ``restore_token`` (``s``) + + The token to restore a previous session. + + If the stored session cannot be restored, this value is ignored + and the user will be prompted normally. This may happen when, for + example, the session contains a monitor or a window that is not + available anymore, or when the stored permissions are withdrawn. + + The restore token is invalidated after using it once. To restore + the same session again, use the new restore token sent in response + to starting this session. + + Setting a restore_token is only allowed for screen cast sessions. + Persistent remote desktop screen cast sessions can only be handled + via the #org.freedesktop.portal.RemoteDesktop interface. + + This option was added in version 4 of this interface. + + * ``persist_mode`` (``u``) + + How this session should persist. Default is 0. Accepted values are: + + - ``0``: Do not persist (default) + - ``1``: Permissions persist as long as the application is running + - ``2``: Permissions persist until explicitly revoked + + Setting persist_mode is only allowed for screen cast sessions. Persistent + remote desktop screen cast sessions can only be handled via the + #org.freedesktop.portal.RemoteDesktop interface. + + If the permission for the session to persist is granted, a restore token will + be returned via the #org.freedesktop.portal.Request::Response signal of the + #org.freedesktop.portal.ScreenCast.Start method. + + This option was added in version 4 of this interface. For available source types, see the AvailableSourceTypes property. --> @@ -187,98 +161,78 @@ using org.freedesktop.portal.ScreenCast.SelectSources(). Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - streams a(ua{sv}) - - An array of PipeWire streams. Each stream consists of a PipeWire - node ID (the first element in the tuple, and a Vardict of - properties. - - The array will contain a single stream if 'multiple' (see - org.freedesktop.portal.ScreenCast.SelectSources()) - was set to 'false', or at least one stream if - 'multiple' was set to 'true' as part of the - org.freedesktop.portal.ScreenCast.SelectSources() method. - - - - restore_token s - - The restore token. This token is a single use token that can later - be used to restore a session. See - org.freedesktop.portal.ScreenCast.SelectSources() for details. - - This response option was added in version 4 of this interface. - - - - - Stream properties include: - - - id s - - Opaque identifier. Will be unique for this stream and local to this - session. Will persist with future sessions, if they are restored - using a restore token. This property was added in version 4 of this - interface. Optional. - - - - position (ii) - - A tuple consisting of the position (x, y) in the compositor - coordinate space. Note that the position may not be equivalent to a - position in a pixel coordinate space. Only available for monitor - streams. Optional. - - - - size (ii) - - A tuple consisting of (width, height). The size represents the size - of the stream as it is displayed in the compositor coordinate - space. Note that this size may not be equivalent to a size in a - pixel coordinate space. The size may differ from the size of the - stream. Optional. - - - - source_type u - - The type of the content which is being screen casted. - For available source types, see the AvailableSourceTypes property. - This property was added in version 3 of this interface. - - - - mapping_id s - - An optional identifier used to map different aspects of the - resource this stream corresponds to. - - When used in a remote desktop session, the mapping_id can be used to - match a libei region of absolute libei devices. There may be - multiple absolute libei devices, and each device may have multiple - regions, but a mapping_id will only match one of these regions per - device. This property was added in version 5 of this interface. - - - + + * ``streams`` (``a(ua{sv})``) + + An array of PipeWire streams. Each stream consists of a PipeWire + node ID (the first element in the tuple, and a Vardict of + properties. + + The array will contain a single stream if 'multiple' (see + org.freedesktop.portal.ScreenCast.SelectSources()) + was set to 'false', or at least one stream if + 'multiple' was set to 'true' as part of the + org.freedesktop.portal.ScreenCast.SelectSources() method. + + Each stream contains the following properties: + + * ``id`` (``s``) + + Opaque identifier. Will be unique for this stream and local to this + session. Will persist with future sessions, if they are restored + using a restore token. This property was added in version 4 of this + interface. Optional. + + * ``position`` (``(ii)``) + + A tuple consisting of the position (x, y) in the compositor + coordinate space. Note that the position may not be equivalent to a + position in a pixel coordinate space. Only available for monitor + streams. Optional. + + * ``size`` (``(ii)``) + + A tuple consisting of (width, height). The size represents the size + of the stream as it is displayed in the compositor coordinate + space. Note that this size may not be equivalent to a size in a + pixel coordinate space. The size may differ from the size of the + stream. Optional. + + * ``source_type`` (``u``) + + The type of the content which is being screen casted. + For available source types, see the AvailableSourceTypes property. + This property was added in version 3 of this interface. + + * ``mapping_id`` (``s``) + + An optional identifier used to map different aspects of the + resource this stream corresponds to. + + When used in a remote desktop session, the mapping_id can be used to + match a libei region of absolute libei devices. There may be + multiple absolute libei devices, and each device may have multiple + regions, but a mapping_id will only match one of these regions per + device. + + This property was added in version 5 of this interface. + + * ``restore_token`` (``s``) + + The restore token. This token is a single use token that can later + be used to restore a session. See + org.freedesktop.portal.ScreenCast.SelectSources() for details. + + This response option was added in version 4 of this interface. --> @@ -310,11 +264,9 @@ A bitmask of available source types. Currently defined types are: - - 1: MONITOR - 2: WINDOW - 4: VIRTUAL - + - ``1``: MONITOR + - ``2``: WINDOW + - ``4``: VIRTUAL --> diff --git a/data/org.freedesktop.portal.Screenshot.xml b/data/org.freedesktop.portal.Screenshot.xml index cfdf61ce6..896c7af65 100644 --- a/data/org.freedesktop.portal.Screenshot.xml +++ b/data/org.freedesktop.portal.Screenshot.xml @@ -43,6 +43,7 @@ Supported keys in the @options vardict include: * ``handle_token`` (``s``) + A string that will be used as the last element of the @handle. Must be a valid object path element. See the #org.freedesktop.portal.Request documentation for more information about the @handle. From 87c52a24957d42aa04a4defaf7115f924f7d368f Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Mon, 20 Nov 2023 16:24:07 -0300 Subject: [PATCH 27/82] Port backend portal interfaces from XML to rST --- data/org.freedesktop.impl.portal.Access.xml | 60 ++- data/org.freedesktop.impl.portal.Account.xml | 54 +-- ...org.freedesktop.impl.portal.AppChooser.xml | 90 ++-- ...org.freedesktop.impl.portal.Background.xml | 37 +- .../org.freedesktop.impl.portal.Clipboard.xml | 38 +- ...reedesktop.impl.portal.DynamicLauncher.xml | 97 ++--- data/org.freedesktop.impl.portal.Email.xml | 82 ++-- ...rg.freedesktop.impl.portal.FileChooser.xml | 393 +++++++----------- ...reedesktop.impl.portal.GlobalShortcuts.xml | 34 +- data/org.freedesktop.impl.portal.Inhibit.xml | 53 +-- ...g.freedesktop.impl.portal.InputCapture.xml | 284 ++++++------- ...g.freedesktop.impl.portal.Notification.xml | 3 +- data/org.freedesktop.impl.portal.Print.xml | 82 ++-- ....freedesktop.impl.portal.RemoteDesktop.xml | 221 ++++------ ...org.freedesktop.impl.portal.ScreenCast.xml | 323 +++++++------- ...org.freedesktop.impl.portal.Screenshot.xml | 59 +-- data/org.freedesktop.impl.portal.Secret.xml | 12 +- data/org.freedesktop.impl.portal.Settings.xml | 39 +- .../org.freedesktop.impl.portal.Wallpaper.xml | 29 +- 19 files changed, 808 insertions(+), 1182 deletions(-) diff --git a/data/org.freedesktop.impl.portal.Access.xml b/data/org.freedesktop.impl.portal.Access.xml index 29a9f7077..11bd2c802 100644 --- a/data/org.freedesktop.impl.portal.Access.xml +++ b/data/org.freedesktop.impl.portal.Access.xml @@ -43,42 +43,34 @@ Presents a "deny/grant" question to the user. Supported keys in the @options include: - - - modal b - Whether to make the dialog modal. Defaults to true. - - - deny_label s - Label for the Deny button. - - - grant_label s - Label for the Grant button. - - - icon s - Icon name for an icon to show in the dialog. This should be a symbolic icon name. - - - choices a(ssa(ss)s) - - List of serialized choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - + + * ``modal`` (``b``) + + Whether to make the dialog modal. Defaults to true. + + * ``deny_label`` (``s``) + + Label for the Deny button. + + * ``grant_label`` (``s``) + + Label for the Grant button. + + * ``icon`` (``s``) + + Icon name for an icon to show in the dialog. This should be a symbolic icon name. + + * ``choices`` (``a(ssa(ss)s)``) + + List of serialized choices. + See org.freedesktop.portal.FileChooser.OpenFile() for details. The following results get returned via the @results vardict: - - - choices a(ss) - - An array of pairs of strings, corresponding to the passed-in choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - + + * ``choices`` (``a(ss)``) + + An array of pairs of strings, corresponding to the passed-in choices. + See org.freedesktop.portal.FileChooser.OpenFile() for details. --> diff --git a/data/org.freedesktop.impl.portal.Account.xml b/data/org.freedesktop.impl.portal.Account.xml index a6acb3329..e584c0c74 100644 --- a/data/org.freedesktop.impl.portal.Account.xml +++ b/data/org.freedesktop.impl.portal.Account.xml @@ -41,43 +41,27 @@ Gets information about the user. Supported keys in the @options vardict include: - - - reason s - - A string that can be shown in the dialog to expain why the information is needed. - This should be a complete sentence that explains what the application will do with - the returned information, for example: Allows your personal information to be included - with recipes you share with your friends. - - - + + * ``reason`` (``s``) + + A string that can be shown in the dialog to expain why the information is needed. + This should be a complete sentence that explains what the application will do with + the returned information, for example: Allows your personal information to be included + with recipes you share with your friends. The following results get returned via the @results vardict: - - - id s - - The user id. - - - - name s - - - The users real name. - - - - - image s - - - The uri of an image file for the users avatar photo. - - - - + + * ``id`` (``s``) + + The user id. + + * ``name`` (``s``) + + The users real name. + + * ``image`` (``s``) + + The URI of an image file for the users avatar photo. --> diff --git a/data/org.freedesktop.impl.portal.AppChooser.xml b/data/org.freedesktop.impl.portal.AppChooser.xml index cbb42ee88..3bd9834b2 100644 --- a/data/org.freedesktop.impl.portal.AppChooser.xml +++ b/data/org.freedesktop.impl.portal.AppChooser.xml @@ -42,57 +42,49 @@ Presents a list of applications to the user to choose one. Supported keys in the @options vardict include: - - - last_choice s - The app id that was selected the last time. - - - modal b - Whether to make the dialog modal. Defaults to yes. - - - content_type s - The content type to choose an application for. - - - uri s - The uri to choose an application for. - - - filename s - The filename to choose an application for. Note that this - is just a basename, without a path. - - - activation_token s - - A token that can be used to activate the application chooser. - - The activation_token option was introduced in version 2 of the interface. - - - + + * ``last_choice`` (``s``) + + The app id that was selected the last time. + + * ``modal`` (``b``) + + Whether to make the dialog modal. Defaults to yes. + + * ``content_type`` (``s``) + + The content type to choose an application for. + + * ``uri`` (``s``) + + The uri to choose an application for. + + * ``filename`` (``s``) + + The filename to choose an application for. Note that this is just a + basename, without a path. + + * ``activation_token`` (``s``) + + A token that can be used to activate the application chooser. + + The activation_token option was introduced in version 2 of the interface. The following results get returned via the @results vardict: - - - choice s - The app id that was selected. - - - activation_token s - - A token that can be used to activate the chosen application. If - the application selection has involved user interaction, a new - token should be generated by the portal implementation. - Otherwise, this token may be the same as the one passed in - @options. - - The activation_token option was introduced in version 2 of the interface. - - - + + * ``choice`` (``s``) + + The app id that was selected. + + * ``activation_token`` (``s``) + + A token that can be used to activate the chosen application. If + the application selection has involved user interaction, a new + token should be generated by the portal implementation. + Otherwise, this token may be the same as the one passed in + @options. + + The activation_token option was introduced in version 2 of the interface. --> diff --git a/data/org.freedesktop.impl.portal.Background.xml b/data/org.freedesktop.impl.portal.Background.xml index 509c51639..8ae6d5ad2 100644 --- a/data/org.freedesktop.impl.portal.Background.xml +++ b/data/org.freedesktop.impl.portal.Background.xml @@ -35,11 +35,10 @@ Gets information about running apps. Each entry has an application ID as key. The returned values are of type u and have the following meaning: - - 0: Background (no open window) - 1: Running (at least one open window) - 2: Active (in the foreground) - + + - ``0``: Background (no open window) + - ``1``: Running (at least one open window) + - ``2``: Active (in the foreground) --> @@ -56,20 +55,15 @@ Notifies the user that an application is running in the background. The following results get returned via the @results vardict: - - - result u - - The choice that the user made regarding the background - activity: - - 0: Forbid background activity by this app - 1: Allow background activity by this app - 2: Allow this instance of background activity - - - - + + * ``result`` (``u``) + + The choice that the user made regarding the background + activity: + + - ``0``: Forbid background activity by this app + - ``1``: Allow background activity by this app + - ``2``: Allow this instance of background activity --> @@ -90,9 +84,8 @@ Enables or disables autostart for an application. The following flags are understood: - - 1: Use D-Bus activation - + + - ``1``: Use D-Bus activation --> diff --git a/data/org.freedesktop.impl.portal.Clipboard.xml b/data/org.freedesktop.impl.portal.Clipboard.xml index 66e5dcb1e..1f5ee04f9 100644 --- a/data/org.freedesktop.impl.portal.Clipboard.xml +++ b/data/org.freedesktop.impl.portal.Clipboard.xml @@ -57,14 +57,10 @@ May only be called if clipboard access was given after starting the session. Supported keys in the @options vardict include: - - - mime_types as - - A list of mime types that the session has clipboard content for. - - - + + * ``mime_types`` (``as``) + + A list of mime types that the session has clipboard content for. --> @@ -92,8 +88,7 @@ SelectionWriteDone: @session_handle: Object path for the #org.freedesktop.portal.Session object @serial: The serial of the request where this answer is directed to - @success: A boolean which indicates whether the transfer of the clipboard - data was successful ('true') or not ('false') + @success: A boolean which indicates whether the transfer of the clipboard data was successful (true') or not ('false') Notifies that the transfer of the clipboard data has either completed successfully, or failed. @@ -133,20 +128,15 @@ Caller will only be notified if clipboard access was given after starting the session. Supported keys in the @options vardict include: - - - mime_types as - - A list of mime types that the the new clipboard selection has content for. - - - - session_is_owner b - - A boolean for whether the session is the owner of the clipboard selection ('true') or not ('false'). - - - + + * ``mime_types`` (``as``) + + A list of mime types that the the new clipboard selection has content for. + + * ``session_is_owner`` (``b``) + + A boolean for whether the session is the owner of the clipboard selection + (``true``) or not (``false``). --> diff --git a/data/org.freedesktop.impl.portal.DynamicLauncher.xml b/data/org.freedesktop.impl.portal.DynamicLauncher.xml index 5a3fec96f..9f6b78a27 100644 --- a/data/org.freedesktop.impl.portal.DynamicLauncher.xml +++ b/data/org.freedesktop.impl.portal.DynamicLauncher.xml @@ -41,61 +41,43 @@ change the name, and confirm installation of the launcher. Supported keys in the @options vardict: - - - modal b - - Whether to make the dialog modal. Defaults to yes. - - - - launcher_type u - - The type of launcher being created. For supported values see the - SupportedLauncherTypes property. Defaults to "Application". - - - - target s - - For a launcher of type "Webapp", this is the URL of the web app - being installed. This is displayed in the user-facing dialog. - For other launcher types, this is not needed. - - - - editable_name b - - If true, the user will be able to edit the name of the launcher. - Defaults to true. - - - - editable_icon b - - If true, the user will be able to edit the icon of the launcher, - if the implementation supports this. Defaults to false. - - - + + * ``modal`` (``b``) + + Whether to make the dialog modal. Defaults to yes. + + * ``launcher_type`` (``u``) + + The type of launcher being created. For supported values see the + SupportedLauncherTypes property. Defaults to "Application". + + * ``target`` (``s``) + + For a launcher of type "Webapp", this is the URL of the web app + being installed. This is displayed in the user-facing dialog. + For other launcher types, this is not needed. + + * ``editable_name`` (``b``) + + If true, the user will be able to edit the name of the launcher. + Defaults to true. + + * ``editable_icon`` (``b``) + + If true, the user will be able to edit the icon of the launcher, + if the implementation supports this. Defaults to false. The following results get returned via the @results vardict: - - - name s - - The name chosen by the user for the launcher (or the default if - the editable_name option was false). - - - - icon v - - The icon chosen by the user for the launcher (or the default if - the editable_icon option was false). - - - + + * ``name`` (``s``) + + The name chosen by the user for the launcher (or the default if + the editable_name option was false). + + * ``icon`` (``v``) + + The icon chosen by the user for the launcher (or the default if + the ``editable_icon`` option was false). --> @@ -112,8 +94,7 @@ RequestInstallToken: @app_id: App id of the application @options: Vardict with optional further information - @response: 0 if the caller should be allowed to do non-interactive - launcher installation, a nonzero number otherwise + @response: 0 if the caller should be allowed to do non-interactive launcher installation, a nonzero number otherwise The @response returned by this method is used to determine whether to give an install token to the caller, which can be used to avoid the need @@ -137,10 +118,8 @@ A bitmask of available launcher types. Currently defined types are: - - 1: Application. A launcher that represents an application. - 2: Webapp. A launcher that represents a web app. - + - ``1``: Application. A launcher that represents an application. + - ``2``: Webapp. A launcher that represents a web app. --> diff --git a/data/org.freedesktop.impl.portal.Email.xml b/data/org.freedesktop.impl.portal.Email.xml index d95879801..81d47a517 100644 --- a/data/org.freedesktop.impl.portal.Email.xml +++ b/data/org.freedesktop.impl.portal.Email.xml @@ -38,56 +38,38 @@ Lets the user compose an email. Supported keys in the @options vardict include: - - - address s - - The email address to send to. - - - - addresses as - - Email addresses to send to. - - - - cc as - - Email addresses to cc. - - - - bcc as - - Email addresses to bcc. - - - - subject s - - The subject for the email. - - - - body s - - The body for the email. - - - - attachments as - - The uris for files to attach. - - - - activation_token s - - A token that can be used to activate the chosen application. - - - + + * ``address`` (``s``) + + The email address to send to. + + * ``addresses`` (``as``) + + Email addresses to send to. + + * ``cc`` (``as``) + + Email addresses to cc. + + * ``bcc`` (``as``) + + Email addresses to bcc. + + * ``subject`` (``s``) + + The subject for the email. + + * ``body`` (``s``) + + The body for the email. + + * ``attachments`` (``as``) + + The uris for files to attach. + + * ``activation_token`` (``s``) + + A token that can be used to activate the chosen application. --> diff --git a/data/org.freedesktop.impl.portal.FileChooser.xml b/data/org.freedesktop.impl.portal.FileChooser.xml index 0ff08ecf6..b539aa1da 100644 --- a/data/org.freedesktop.impl.portal.FileChooser.xml +++ b/data/org.freedesktop.impl.portal.FileChooser.xml @@ -44,91 +44,63 @@ Presents a file chooser dialog to the user to open one or more files. Supported keys in the @options vardict include: - - - accept_label s - - The label for the accept button. Mnemonic underlines are allowed. - - - - modal b - - Whether to make the dialog modal. Default is yes. - - - - multiple b - - Whether to allow selection of multiple files. Default is no. - - - - directory b - - Whether to select for folders instead of files. Default is to select files. - - - - filters a(sa(us)) - - A list of serialized file filters. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_filter (sa(us)) - - Request that this filter be set by default at dialog creation. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - choices a(ssa(ss)s) - - A list of serialized combo boxes. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_folder ay - - A suggested folder to open the files from. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - + + * ``accept_label`` (``s``) + + The label for the accept button. Mnemonic underlines are allowed. + + * ``modal`` (``b``) + + Whether to make the dialog modal. Default is yes. + + * ``multiple`` (``b``) + + Whether to allow selection of multiple files. Default is no. + + * ``directory`` (``b``) + + Whether to select for folders instead of files. Default is to select files. + + * ``filters`` (``a(sa(us))``) + + A list of serialized file filters. + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_filter`` (``(sa(us))``) + + Request that this filter be set by default at dialog creation. + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``choices`` (``a(ssa(ss)s)``) + + A list of serialized combo boxes. + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_folder`` (``ay``) + + A suggested folder to open the files from. + See org.freedesktop.portal.FileChooser.OpenFile() for details. The following results get returned via the @results vardict: - - - uris as - - An array of strings containing the uris of the selected files. All - URIs must have the "file://" scheme. - - - - choices a(ss) - - An array of pairs of strings, corresponding to the passed-in choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_filter (sa(us)) - - The filter that was selected. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - writable b - - Whether the file is opened with write access. Default is no. - - - + + * ``uris`` (``as``) + + An array of strings containing the uris of the selected files. All + URIs must have the ``file://`` scheme. + + * ``choices`` (``a(ss)``) + + An array of pairs of strings, corresponding to the passed-in choices. + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_filter`` (``(sa(us))``) + + The filter that was selected. + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``writable`` (``b``) + + Whether the file is opened with write access. Default is ``false``. --> @@ -154,92 +126,62 @@ Presents a file chooser dialog to the user to save a file. Supported keys in the @options vardict include: - - - accept_label s - - The label for the accept button. Mnemonic underlines are allowed. - - - - modal b - - Whether to make the dialog modal. Default is yes. - - - - multiple b - - Whether to allow selection of multiple files. Default is no. - - - - filters a(sa(us)) - - A list of serialized file filters. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_filter (sa(us)) - - Request that this filter be set by default at dialog creation. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - choices a(ssa(ss)s) - - A list of serialized combo boxes. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_name s - - A suggested filename. - - - - current_folder ay - - A suggested folder to save the file in. - - - - current_file ay - - The current file (when saving an existing file). - - - + + * ``accept_label`` (``s``) + + The label for the accept button. Mnemonic underlines are allowed. + + * ``modal`` (``b``) + + Whether to make the dialog modal. Default is yes. + + * ``multiple`` (``b``) + + Whether to allow selection of multiple files. Default is no. + + * ``filters`` (``a(sa(us))``) + + A list of serialized file filters. + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_filter`` (``(sa(us))``) + + Request that this filter be set by default at dialog creation. + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``choices`` (``a(ssa(ss)s)``) + + A list of serialized combo boxes. + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_name`` (``s``) + + A suggested filename. + + * ``current_folder`` (``ay``) + + A suggested folder to save the file in. + + * ``current_file`` (``ay``) + + The current file (when saving an existing file). The following results get returned via the @results vardict: - - - uris as - - An array of strings containing the uri of the selected file. All - URIs must have the "file://" scheme. - - - - choices a(ss) - - An array of pairs of strings, corresponding to the passed-in choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_filter (sa(us)) - - - The filter that was selected. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - + + * ``uris`` (``as``) + + An array of strings containing the uri of the selected file. All + URIs must have the "file://" scheme. + + * ``choices`` (``a(ss)``) + + An array of pairs of strings, corresponding to the passed-in choices. + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_filter`` (``(sa(us))``) + + The filter that was selected. + See org.freedesktop.portal.FileChooser.OpenFile() for details. --> @@ -258,6 +200,8 @@ @title: Title for the file chooser dialog @options: Vardict with optional further information @handle: Object path for the #org.freedesktop.portal.Request object representing this call + @response: Numeric response + @results: Vardict with the results of the call Asks for a folder as a location to save one or more files. The names of the files will be used as-is and appended to the @@ -267,80 +211,53 @@ construct a unique file name and return that instead. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the - @handle. Must be a valid object path element. See the - #org.freedesktop.portal.Request documentation for more - information about the @handle. - - - - accept_label s - - Label for the accept button. Mnemonic underlines are allowed. - - - - modal b - - Whether the dialog should be modal. Default is yes. - - - - choices a(ssa(ss)s) - - List of serialized combo boxes. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - - current_folder ay - - - Suggested folder to save the files in. The byte array is - expected to be null-terminated. - - - - - files aay - - - An array of file names to be saved. The array and byte - arrays are expected to be null-terminated. - - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the + @handle. Must be a valid object path element. See the + #org.freedesktop.portal.Request documentation for more + information about the @handle. + + * ``accept_label`` (``s``) + + Label for the accept button. Mnemonic underlines are allowed. + + * ``modal`` (``b``) + + Whether the dialog should be modal. Default is yes. + + * ``choices`` (``a(ssa(ss)s)``) + + List of serialized combo boxes. + See org.freedesktop.portal.FileChooser.OpenFile() for details. + + * ``current_folder`` (``ay``) + + Suggested folder to save the files in. The byte array is + expected to be null-terminated. + + * ``files`` (``aay``) + + An array of file names to be saved. The array and byte + arrays are expected to be null-terminated. The following results get returned via the #org.freedesktop.portal.Request::Response signal: - - - uris as - - - An array of strings containing the uri corresponding to - each file given by @options, in the same order. Note that - the file names may have changed, for example if a file - with the same name in the selected folder already exists. - - - All URIs must have the "file://" scheme. - - - - - choices a(ss) - - An array of pairs of strings, corresponding to the passed-in choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. - - - + + * ``uris`` (``as``) + + An array of strings containing the uri corresponding to + each file given by @options, in the same order. Note that + the file names may have changed, for example if a file + with the same name in the selected folder already exists. + + All URIs must have the "file://" scheme. + + * ``choices`` (``a(ss)``) + + An array of pairs of strings, corresponding to the passed-in choices. + See org.freedesktop.portal.FileChooser.OpenFile() for details. --> diff --git a/data/org.freedesktop.impl.portal.GlobalShortcuts.xml b/data/org.freedesktop.impl.portal.GlobalShortcuts.xml index 24b398a15..afd4d69ea 100644 --- a/data/org.freedesktop.impl.portal.GlobalShortcuts.xml +++ b/data/org.freedesktop.impl.portal.GlobalShortcuts.xml @@ -34,21 +34,17 @@ @handle: Object path for the #org.freedesktop.impl.portal.Request object representing this call @session_handle: Object path for the #org.freedesktop.impl.portal.Session object representing the session being created @app_id: App id of the application - @options: Vardict with optional further information. See @org.freedesktop.portal.GlobalShortcuts.CreateSession + @options: Vardict with optional further information. See org.freedesktop.portal.GlobalShortcuts.CreateSession() @response: Numeric Request response @results: Vardict with the results of the call Create a global shortcuts session. The following results get returned in the @results vardict: - - - session_id s - - The session id. A string representing the created global shortcuts session. - - - + + * ``session_id`` (``s``) + + The session id. A string representing the created global shortcuts session. --> @@ -99,18 +95,14 @@ List shortcuts registered in the global shortcuts session. The following results get returned in the @results vardict: - - - shortcuts a(sa{sv}) - - A list of shortcuts. - - See the #org.freedesktop.portal.Request::Response signal of the - org.freedesktop.portal.GlobalShortcuts.BindShortcuts() method for - the list of supported properties of shortcuts. - - - + + * ``shortcuts a(sa{sv}) + + A list of shortcuts. + + See the #org.freedesktop.portal.Request::Response signal of the + org.freedesktop.portal.GlobalShortcuts.BindShortcuts() method for + the list of supported properties of shortcuts. --> diff --git a/data/org.freedesktop.impl.portal.Inhibit.xml b/data/org.freedesktop.impl.portal.Inhibit.xml index 0c20d7640..86c15b74b 100644 --- a/data/org.freedesktop.impl.portal.Inhibit.xml +++ b/data/org.freedesktop.impl.portal.Inhibit.xml @@ -41,20 +41,17 @@ org.freedesktop.impl.portal.Request.Close() on that object. The flags determine what changes are inhibited: - - 1: Logout - 2: User Switch - 4: Suspend - 8: Idle - + + - ``1``: Logout + - ``2``: User Switch + - ``4``: Suspend + - ``8``: Idle Supported keys in the @options vardict include: - - - reason s - User-visible reason for the inhibition. - - + + * ``reason`` (``s``) + + User-visible reason for the inhibition. --> @@ -99,26 +96,18 @@ of receiving the StateChanged signal. The following information may get returned in the @state vardict: - - - screensaver-active b - - Whether the screensaver is active. - - - - session-state u - - The state of the session. - - - 1: Running - 2: Query End - 3: Ending - - - - + + * ``screensaver-active`` (``b``) + + Whether the screensaver is active. + + * ``session-state`` (``u``) + + The state of the session. + + - ``1``: Running + - ``2``: Query End + - ``3``: Ending --> diff --git a/data/org.freedesktop.impl.portal.InputCapture.xml b/data/org.freedesktop.impl.portal.InputCapture.xml index c431a413e..1857efced 100644 --- a/data/org.freedesktop.impl.portal.InputCapture.xml +++ b/data/org.freedesktop.impl.portal.InputCapture.xml @@ -42,32 +42,22 @@ Create a capture input session. Supported keys in the @options vardict include: - - - capabilities u - - Bitmask of requested capabilities, see the - SupportedCapabilities property. This value is required. - - - + + * ``capabilities`` (``u``) + + Bitmask of requested capabilities, see the + SupportedCapabilities property. This value is required. The following results get returned in the @results vardict: - - - session_id s - - The session id. A string representing the created capture input session. - - - - capabilities u - - The capabilities available to this session. This is always a - subset of the requested capabilities. - - - + + * ``session_id`` (``s``) + + The session id. A string representing the created capture input session. + + * ``capabilities`` (``u``) + + The capabilities available to this session. This is always a + subset of the requested capabilities. --> @@ -92,21 +82,15 @@ Return the current zones for this session. The following results get returned in the @results vardict: - - - zones a(uuii) - - An array of zones with width, height, x-offset, y-offset. - - - - zone_set u - - The zone_set ID required in - org.freedesktop.impl.portal.InputCapture.SetPointerBarriers(). - - - + + * ``zones`` (``a(uuii)``) + + An array of zones with width, height, x-offset, y-offset. + + * ``zone_set`` (``u``) + + The zone_set ID required in + org.freedesktop.impl.portal.InputCapture.SetPointerBarriers(). --> @@ -133,35 +117,25 @@ Set up zero or more pointer barriers. Supported keys in the @barriers vardicts include: - - - barrier_id u - - The non-zero id of this barrier. This id is used in the - #org.freedesktop.portal.impl.InputCapture::Activated signal to inform - which barrier triggered input capture. - - - - position (iiii) - - The x1/y1 x2/y2 position of the pointer barrier. A horizontal - pointer barrier must have y1 == y2, a vertical pointer barrier - must have x1 == x2. Diagonal pointer barriers are not supported. - - - + + * ``barrier_id`` (``u``) + + The non-zero id of this barrier. This id is used in the + #org.freedesktop.portal.impl.InputCapture::Activated signal to inform + which barrier triggered input capture. + + * ``position`` (``(iiii)``) + + The x1/y1 x2/y2 position of the pointer barrier. A horizontal + pointer barrier must have y1 == y2, a vertical pointer barrier + must have x1 == x2. Diagonal pointer barriers are not supported. The following results get returned in the @results vardict: - - - failed_barriers au - - An array of barrier_ids of pointer barriers that have been denied. The - id matches the barrier_id of the entries in the @barriers argument. - - - + + * ``failed_barriers`` (``au``) + + An array of barrier_ids of pointer barriers that have been denied. The + id matches the barrier_id of the entries in the @barriers argument. --> @@ -221,26 +195,20 @@ Release ongoing input capturing. Supported keys in the @options vardict include: - - - activation_id u - - The same activation_id number as in the - #org.freedesktop.impl.portal.InputCapture::Activated signal. - - - - cursor_position (dd) - - The suggested cursor position within the Zones available in - this session. - - This is a suggestion to the compositor to place the cursor in - the correct position to allow for fluent movement between virtual - screens. The compositor is not required to honor this suggestion. - - - + + * ``activation_id`` (``u``) + + The same activation_id number as in the + #org.freedesktop.impl.portal.InputCapture::Activated signal. + + * ``cursor_position`` (``(dd)``) + + The suggested cursor position within the Zones available in + this session. + + This is a suggestion to the compositor to place the cursor in + the correct position to allow for fluent movement between virtual + screens. The compositor is not required to honor this suggestion. --> @@ -302,58 +270,50 @@ to org.freedesktop.impl.portal.InputCapture.Enable(). Supported keys in the @options vardict include: - - - activation_id u - - A number that can be used to synchronize with the - transport-layer. This number has no intrinsic meaning but - is guaranteed to increase by an unspecified amount on each call. - - In particular: if the compositor sends an activation_id of N as - part of this request it will also set the sequence in EIS' - start_emulating event the same value N on the EIS connection - before the first event from a device is sent. - This allows an application to have a synchronization point and - attribute an event sequence to the portal interaction. - - Applications must be able to handle the activation_id number wrapping - around. Implementations of this portal must to increase the - activation_id number by an sensible amount to allow for wrapping - detection. - - - - cursor_position (dd) - - The current cursor position. Note that this position may be - outside the Zones available to this session - this indicates - movement larger than a single pixel. - - For example, a fast movement against a barrier on the right edge - of a screen may logically put the cursor dozens of pixels into - the (non-existing) screen on the other side of the barrier. - It is the application's responsibility to adjust the cursor - position as necessary. - - - - barrier_id u - - The barrier id of the barrier that triggered. If the value is - nonzero, it matches the barrier id as specified in - org.freedesktop.impl.portal.InputCapture.SetPointerBarriers(). - - If the id is zero, the pointer barrier could be determined. - If the id is missing, the input capture was not triggered by a - pointer barrier. - - Where more than one pointer barrier are triggered by the same - movement it is up to the compositor to choose one barrier (or use - a barrier id of zero). - - - + + * ``activation_id`` (``u``) + + A number that can be used to synchronize with the + transport-layer. This number has no intrinsic meaning but + is guaranteed to increase by an unspecified amount on each call. + + In particular: if the compositor sends an activation_id of N as + part of this request it will also set the sequence in EIS' + start_emulating event the same value N on the EIS connection + before the first event from a device is sent. + This allows an application to have a synchronization point and + attribute an event sequence to the portal interaction. + + Applications must be able to handle the activation_id number wrapping + around. Implementations of this portal must to increase the + activation_id number by an sensible amount to allow for wrapping + detection. + + * ``cursor_position`` (``(dd)``) + + The current cursor position. Note that this position may be + outside the Zones available to this session - this indicates + movement larger than a single pixel. + + For example, a fast movement against a barrier on the right edge + of a screen may logically put the cursor dozens of pixels into + the (non-existing) screen on the other side of the barrier. + It is the application's responsibility to adjust the cursor + position as necessary. + + * ``barrier_id`` (``u``) + + The barrier id of the barrier that triggered. If the value is + nonzero, it matches the barrier id as specified in + org.freedesktop.impl.portal.InputCapture.SetPointerBarriers(). + + If the id is zero, the pointer barrier could be determined. + If the id is missing, the input capture was not triggered by a + pointer barrier. + + Where more than one pointer barrier are triggered by the same + movement it is up to the compositor to choose one barrier (or use + a barrier id of zero). --> @@ -370,29 +330,23 @@ capture, an application must call org.freedesktop.portal.InputCapture.Disable(). Supported keys in the @options vardict include: - - - activation_id u - - The same activation_id as in the corresponding - #org.freedesktop.impl.portal.InputCapture::Activated signal. - - - - cursor_position (dd) - - The current cursor position. Note that this position may be - outside the Zones available to this session - this indicates - movement larger than a single pixel. - - For example, a fast movement against a barrier on the right edge - of a screen may logically put the cursor dozens of pixels into - the (non-existing) screen on the other side of the barrier. - It is the application's responsibility to adjust the cursor - position as necessary. - - - + + * ``activation_id`` (``u``) + + The same activation_id as in the corresponding + #org.freedesktop.impl.portal.InputCapture::Activated signal. + + * ``cursor_position`` (``(dd)``) + + The current cursor position. Note that this position may be + outside the Zones available to this session - this indicates + movement larger than a single pixel. + + For example, a fast movement against a barrier on the right edge + of a screen may logically put the cursor dozens of pixels into + the (non-existing) screen on the other side of the barrier. + It is the application's responsibility to adjust the cursor + position as necessary. --> @@ -424,11 +378,9 @@ Currently defined types are: - - 1: KEYBOARD - 2: POINTER - 4: TOUCHSCREEN - + - ``1``: KEYBOARD + - ``2``: POINTER + - ``4``: TOUCHSCREEN --> diff --git a/data/org.freedesktop.impl.portal.Notification.xml b/data/org.freedesktop.impl.portal.Notification.xml index 39e4fa8d8..0058f2b6e 100644 --- a/data/org.freedesktop.impl.portal.Notification.xml +++ b/data/org.freedesktop.impl.portal.Notification.xml @@ -65,8 +65,7 @@ @app_id: App id of the application @id: the application-provided ID for the notification @action: the name of the action - @parameter: array which will contain the target parameter - for the action, if one was specified + @parameter: array which will contain the target parameter for the action, if one was specified Send to the application when a non-exported action is activated. diff --git a/data/org.freedesktop.impl.portal.Print.xml b/data/org.freedesktop.impl.portal.Print.xml index 88e616392..4363050be 100644 --- a/data/org.freedesktop.impl.portal.Print.xml +++ b/data/org.freedesktop.impl.portal.Print.xml @@ -48,20 +48,14 @@ it considers tokens valid. Supported keys in the @options vardict: - - - modal b - - Whether to make the dialog modal. Defaults to yes. - - - - token u - - Token that was returned by a previous org.freedesktop.impl.portal.Print.PreparePrint() call. - - - + + * ``modal`` (``b``) + + Whether to make the dialog modal. Defaults to yes. + + * ``token`` (``u``) + + Token that was returned by a previous org.freedesktop.impl.portal.Print.PreparePrint() call. --> @@ -75,7 +69,7 @@ - + @@ -73,56 +69,40 @@ Configure what the devices remote desktop session should expose. Supported keys in the @options vardict include: - - - types u - - Bitmask of what device types to request remote controlling of. - Default is all. - - - - restore_data (suv) - - The data to restore from a previous session. - - - If the stored session cannot be restored, this value is ignored - and the user will be prompted normally. This may happen when, for - example, the session contains a monitor or a window that is not - available anymore, or when the stored permissions are withdrawn. - - - The restore data is composed of the vendor name (e.g. "GNOME" or - "KDE"), the version of the implementation-specific private data, - and the implementation-specific private data itself. - - - This option was added in version 2 of this interface. - - - - persist_mode u - - How this session should persist. Default is 0. Accepted values are: - - - - 0: Do not persist (default) - 1: Permissions persist as long as the application is running - 2: Permissions persist until explicitly revoked - - - - If the permission for the session to persist is granted, "restore_data" - will be returned in the results of the - #org.freedesktop.impl.portal.RemoteDesktop.Start method. - - - This option was added in version 2 of this interface. - - - + + * ``types`` (``u``) + + Bitmask of what device types to request remote controlling of. + Default is all. + + * ``restore_data`` (``(suv)``) + + The data to restore from a previous session. + + If the stored session cannot be restored, this value is ignored + and the user will be prompted normally. This may happen when, for + example, the session contains a monitor or a window that is not + available anymore, or when the stored permissions are withdrawn. + + The restore data is composed of the vendor name (e.g. "GNOME" or + "KDE"), the version of the implementation-specific private data, + and the implementation-specific private data itself. + + This option was added in version 2 of this interface. + + * ``persist_mode`` (``u``) + + How this session should persist. Default is 0. Accepted values are: + + - ``0``: Do not persist (default) + - ``1``: Permissions persist as long as the application is running + - ``2``: Permissions persist until explicitly revoked + + If the permission for the session to persist is granted, ``restore_data`` + will be returned in the results of the + #org.freedesktop.impl.portal.RemoteDesktop.Start method. + + This option was added in version 2 of this interface. For available device types, see the AvailableDeviceTypes property. --> @@ -140,7 +120,7 @@ @handle: Object path for the #org.freedesktop.impl.portal.Request object representing this call @app_id: App id of the application @parent_window: Identifier for the application window, see Common Conventions - @session: Identifier for the remote desktop session + @session_handle: Identifier for the remote desktop session @parent_window: Identifier for the application window @options: Vardict with optional further information @response: Numeric response @@ -150,48 +130,35 @@ presenting a dialog. Supported keys in the @options vardict include: - - - handle_token s - - A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for - more information about the @handle. - - - + + * ``handle_token`` (``s``) + + A string that will be used as the last element of the @handle. Must be a valid + object path element. See the #org.freedesktop.portal.Request documentation for + more information about the @handle. The following results get returned in the @results vardict: - - - devices u - - A bitmask of the devices selected by the user. - - - - clipboard_enabled b - - A boolean for whether the clipboard was enabled ('true') or not ('false'). - See the #org.freedesktop.portal.Clipboard documentation for more information. - Since version 2. - - - - streams a(ua{sv}) - - Equivalent to the streams entry documented in - #org.freedesktop.impl.portal.ScreenCast.Start. - - - - devices u - - The device types that can be used for remote control. See the - AvailableDeviceTypes property. - - - + + * ``devices`` (``u``) + + A bitmask of the devices selected by the user. + + * ``clipboard_enabled`` (``b``) + + A boolean for whether the clipboard was enabled ('true') or not ('false'). + See the #org.freedesktop.portal.Clipboard documentation for more information. + + Since version 2. + + * ``streams`` (``a(ua{sv})``) + + Equivalent to the streams entry documented in + #org.freedesktop.impl.portal.ScreenCast.Start. + + * ``devices`` (``u``) + + The device types that can be used for remote control. See the + AvailableDeviceTypes property. --> @@ -254,10 +221,9 @@ session. Available button states: - - 0: Released - 1: Pressed - + + - ``0``: Released + - ``1``: Pressed --> @@ -280,16 +246,12 @@ session. Supported keys in the @options vardict include: - - - finish b - - If set to true, this is the last axis event in a series, for - example as a result of the fingers being lifted from a touchpad - after a two-finger scroll. Default is false. - - - + + * ``finish`` (``b``) + + If set to true, this is the last axis event in a series, for + example as a result of the fingers being lifted from a touchpad + after a two-finger scroll. Default is false. --> @@ -308,10 +270,9 @@ session. Available axes: - - 0: Vertical scroll - 1: Horizontal scroll - + + - ``0``: Vertical scroll + - ``1``: Horizontal scroll --> @@ -330,10 +291,9 @@ session. Available keyboard keysym states: - - 0: Released - 1: Pressed - + + - ``0``: Released + - ``1``: Pressed --> @@ -352,10 +312,9 @@ session. Available keyboard keysym states: - - 0: Released - 1: Pressed - + + - ``0``: Released + - ``1``: Pressed --> @@ -377,7 +336,7 @@ Notify about a new touch down event. The (x, y) position represents the new touch point position in the streams logical - coordinate space (see the logical_size stream property in + coordinate space (see the ``logical_size`` stream property in #org.freedesktop.portal.ScreenCast). --> @@ -402,7 +361,7 @@ Notify about a new touch motion event. The (x, y) position represents where the touch point position in the streams logical - coordinate space moved (see the logical_size stream property in + coordinate space moved (see the ``logical_size`` stream property in #org.freedesktop.portal.ScreenCast). --> @@ -454,11 +413,9 @@ A bitmask of available source types. Currently defined types are: - - 1: KEYBOARD - 2: POINTER - 4: TOUCHSCREEN - + - ``1``: KEYBOARD + - ``2``: POINTER + - ``4``: TOUCHSCREEN --> diff --git a/data/org.freedesktop.impl.portal.ScreenCast.xml b/data/org.freedesktop.impl.portal.ScreenCast.xml index 23a24e650..aa48205b8 100644 --- a/data/org.freedesktop.impl.portal.ScreenCast.xml +++ b/data/org.freedesktop.impl.portal.ScreenCast.xml @@ -38,14 +38,10 @@ Create a screen cast session. The following results get returned in the @results vardict: - - - session_id s - - The session id. A string representing the created screen cast session. - - - + + * ``session_id`` (``s``) + + The session id. A string representing the created screen cast session. --> @@ -69,73 +65,53 @@ Configure what the screen cast session should record. Supported keys in the @options vardict include: - - - types u - - Bitmask of what type of content to record. Default is MONITOR. - - - - multiple b - - Whether to allow selecting multiple sources. Default is no. - - - - cursor_mode u - - Determines how the cursor will be drawn in the screen cast stream. It must be - one of the cursor modes advertised in - #org.freedesktop.portal.impl.ScreenCast.AvailableCursorModes. Setting a cursor - mode not advertised will cause the screen cast session to be closed. The default - cursor mode is 'Hidden'. - - This option was added in version 2 of this interface. - - - - restore_data (suv) - - The data to restore from a previous session. - - - If the stored session cannot be restored, this value is ignored - and the user will be prompted normally. This may happen when, for - example, the session contains a monitor or a window that is not - available anymore, or when the stored permissions are withdrawn. - - - The restore data is composed of the vendor name (e.g. "GNOME" or - "KDE"), the version of the implementation-specific private data, - and the implementation-specific private data itself. - - - This option was added in version 4 of this interface. - - - - persist_mode u - - How this session should persist. Default is 0. Accepted values are: - - - - 0: Do not persist (default) - 1: Permissions persist as long as the application is running - 2: Permissions persist until explicitly revoked - - - - If the permission for the session to persist is granted, - "persist_mode" will be returned in the results of the - #org.freedesktop.impl.portal.ScreenCast.Start method. - - - This option was added in version 4 of this interface. - - - + + * ``types`` (``u``) + + Bitmask of what type of content to record. Default is MONITOR. + + * ``multiple`` (``b``) + + Whether to allow selecting multiple sources. Default is no. + + * ``cursor_mode`` (``u``) + + Determines how the cursor will be drawn in the screen cast stream. It must be + one of the cursor modes advertised in + #org.freedesktop.portal.impl.ScreenCast.AvailableCursorModes. Setting a cursor + mode not advertised will cause the screen cast session to be closed. The default + cursor mode is 'Hidden'. + + This option was added in version 2 of this interface. + + * ``restore_data`` (``(suv)``) + + The data to restore from a previous session. + + If the stored session cannot be restored, this value is ignored + and the user will be prompted normally. This may happen when, for + example, the session contains a monitor or a window that is not + available anymore, or when the stored permissions are withdrawn. + + The restore data is composed of the vendor name (e.g. "GNOME" or + "KDE"), the version of the implementation-specific private data, + and the implementation-specific private data itself. + + This option was added in version 4 of this interface. + + * ``persist_mode`` (``u``) + + How this session should persist. Default is 0. Accepted values are: + + - ``0``: Do not persist (default) + - ``1``: Permissions persist as long as the application is running + - ``2``: Permissions persist until explicitly revoked + + If the permission for the session to persist is granted, + "persist_mode" will be returned in the results of the + org.freedesktop.impl.portal.ScreenCast.Start() method. + + This option was added in version 4 of this interface. For available source types, see the AvailableSourceTypes property. --> @@ -163,105 +139,87 @@ a dialog letting the user do the selection set up by SelectSources. The following results get returned in the @results vardict: - - - streams a(ua{sv}) - - An array of PipeWire streams. Each stream consists of a PipeWire - node ID (the first element in the tuple, and a Vardict of - properties. - - The array will contain a single stream if 'multiple' (see - SelectSources) was set to 'false', or at least one stream if - 'multiple' was set to 'true' as part of the SelectSources method. - - - - persist_mode u - - Portal implementations can optionally offer ways to "reduce" the - persist mode, for example by explicitly asking the user. See the - 'persist_mode' option of SelectSources for a list of possible - values. - - If no persist mode is returned by the Start request, it is assumed - to be the same persist mode received during SelectSources. - - This option was added in version 4 of this interface. - - - - restore_data (suv) - - The data to be restored. This is the data that a portal - implementation sent in reaction to transient or persistent - modes. - - - This data will be stored in the permission store if the effective - persist mode is 2, and may be passed in the future as part of the - SelectSources() method call. The portal backend should store enough - information in 'restore_data' to be able to restore the session - later. The portal backend can deal with unavailable sources however - they see fit. - - - Data generated by a portal implementation must be consumable by - the same portal implementation, but not necessarily by others. - Thus, it is important to properly handle 'restore_data' not being - in a valid format. This may happen when, e.g., the user switched - to another desktop environment, or is using a different portal - implementation. - - - This response option was added in version 4 of this interface. - - - - - Stream properties include: - - - position (ii) - - A tuple consisting of the position (x, y) in the compositor - coordinate space. Note that the position may not be equivalent to a - position in a pixel coordinate space. Only available for monitor - streams. - - - - size (ii) - - A tuple consisting of (width, height). The size represents the size - of the stream as it is displayed in the compositor coordinate - space. Note that this size may not be equivalent to a size in a - pixel coordinate space. The size may differ from the size of the - stream. - - - - source_type u - - The type of the content which is being screen casted. - For available source types, see the AvailableSourceTypes property. - This property was added in version 3 of this interface. - - - - mapping_id s - - An optional identifier used to map different aspects of the - resource this stream corresponds to. - - When used in a remote desktop session, the mapping_id can be used to - match a libei region of absolute libei devices. There may be - multiple absolute libei devices, and each device may have multiple - regions, but a mapping_id will only match one of these regions per - device. This property was added in version 5 of this interface. - - - + + * ``streams`` (``a(ua{sv})``) + + An array of PipeWire streams. Each stream consists of a PipeWire + node ID (the first element in the tuple, and a Vardict of + properties. + + The array will contain a single stream if 'multiple' (see + SelectSources) was set to 'false', or at least one stream if + 'multiple' was set to 'true' as part of the SelectSources method. + + Each stream constains the following properties: + + * ``position`` (``(ii)``) + + A tuple consisting of the position (x, y) in the compositor + coordinate space. Note that the position may not be equivalent to a + position in a pixel coordinate space. Only available for monitor + streams. + + * ``size`` (``(ii)``) + + A tuple consisting of (width, height). The size represents the size + of the stream as it is displayed in the compositor coordinate + space. Note that this size may not be equivalent to a size in a + pixel coordinate space. The size may differ from the size of the + stream. + + * ``source_type`` (``u``) + + The type of the content which is being screen casted. + For available source types, see the AvailableSourceTypes property. + + This property was added in version 3 of this interface. + + * ``mapping_id`` (``s``) + + An optional identifier used to map different aspects of the + resource this stream corresponds to. + + When used in a remote desktop session, the mapping_id can be used to + match a libei region of absolute libei devices. There may be + multiple absolute libei devices, and each device may have multiple + regions, but a mapping_id will only match one of these regions per + device. + + This property was added in version 5 of this interface. + + * ``persist_mode`` (``u``) + + Portal implementations can optionally offer ways to "reduce" the + persist mode, for example by explicitly asking the user. See the + 'persist_mode' option of SelectSources for a list of possible + values. + + If no persist mode is returned by the Start request, it is assumed + to be the same persist mode received during SelectSources. + + This option was added in version 4 of this interface. + + * ``restore_data`` (``(suv)``) + + The data to be restored. This is the data that a portal + implementation sent in reaction to transient or persistent + modes. + + This data will be stored in the permission store if the effective + persist mode is 2, and may be passed in the future as part of the + SelectSources() method call. The portal backend should store enough + information in 'restore_data' to be able to restore the session + later. The portal backend can deal with unavailable sources however + they see fit. + + Data generated by a portal implementation must be consumable by + the same portal implementation, but not necessarily by others. + Thus, it is important to properly handle 'restore_data' not being + in a valid format. This may happen when, e.g., the user switched + to another desktop environment, or is using a different portal + implementation. + + This response option was added in version 4 of this interface. --> @@ -279,22 +237,19 @@ A bitmask of available source types. Currently defined types are: - - 1: MONITOR - 2: WINDOW - 4: VIRTUAL - + - ``1``: MONITOR + - ``2``: WINDOW + - ``4``: VIRTUAL --> diff --git a/data/org.freedesktop.impl.portal.Screenshot.xml b/data/org.freedesktop.impl.portal.Screenshot.xml index 1c276519a..d3eb68afd 100644 --- a/data/org.freedesktop.impl.portal.Screenshot.xml +++ b/data/org.freedesktop.impl.portal.Screenshot.xml @@ -40,39 +40,28 @@ Takes a screenshot. Supported keys in the @options vardict include: - - - modal b - - Whether the dialog should be modal. Defaults to yes. - - - - interactive b - - Hint whether the dialog should offer customization before taking a screenshot. - Defaults to no. - - - - permission_store_checked b - - Hint whether the screenshot portal has checked the 'screenshot' permission for - the requesting app. Defaults to no. - - This option was added in version 2 of this interface. - - - + + * ``modal`` (``b``) + + Whether the dialog should be modal. Defaults to yes. + + * ``interactive`` (``b``) + + Hint whether the dialog should offer customization before taking a screenshot. + Defaults to no. + + * ``permission_store_checked`` (``b``) + + Hint whether the screenshot portal has checked the 'screenshot' permission for + the requesting app. Defaults to no. + + This option was added in version 2 of this interface. The following results get returned via the @results vardict: - - - uri s - A string containing the uri of the screenshot. - - + * ``uri`` (``s``) + + A string containing the URI of the screenshot. --> @@ -97,12 +86,10 @@ Obtains the value of a pixel. The following results get returned via the @results vardict: - - - color (ddd) - The color, rgb values in the range [0,1]. - - + + * ``color``` (``(ddd)``) + + The color, RGB values in the range [0,1]. --> diff --git a/data/org.freedesktop.impl.portal.Secret.xml b/data/org.freedesktop.impl.portal.Secret.xml index f540a72e1..023aab18f 100644 --- a/data/org.freedesktop.impl.portal.Secret.xml +++ b/data/org.freedesktop.impl.portal.Secret.xml @@ -40,14 +40,10 @@ Retrieves a master secret for a sandboxed application. Supported keys in the @options vardict include: - - - token s - - An opaque string associated with the retrieve secret. - - - + + * ``token`` (``s``) + + An opaque string associated with the retrieve secret. --> diff --git a/data/org.freedesktop.impl.portal.Settings.xml b/data/org.freedesktop.impl.portal.Settings.xml index 581ca2278..9c08e9e5b 100644 --- a/data/org.freedesktop.impl.portal.Settings.xml +++ b/data/org.freedesktop.impl.portal.Settings.xml @@ -29,29 +29,22 @@ Currently the interface provides the following keys: - - - org.freedesktop.appearance color-scheme u - - Indicates the system's preferred color scheme. - Supported values are: - - 0: No preference - 1: Prefer dark appearance - 2: Prefer light appearance - - Unknown values should be treated as 0 (no preference). - - - - org.freedesktop.appearance accent-color (ddd) - - Indicates the system's preferred accent color as a tuple of RGB values - in the sRGB color space, in the range [0,1]. - Out-of-range RGB values should be treated as an unset accent color. - - - + * ``org.freedesktop.appearance`` ``color-scheme`` (``u``) + + Indicates the system's preferred color scheme. + Supported values are: + + - ``0``: No preference + - ``1``: Prefer dark appearance + - ``2``: Prefer light appearance + + Unknown values should be treated as 0 (no preference). + + * ``org.freedesktop.appearance`` ``accent-color`` (``(ddd)``) + + Indicates the system's preferred accent color as a tuple of RGB values + in the sRGB color space, in the range [0,1]. + Out-of-range RGB values should be treated as an unset accent color. Implementations can provide other keys; they are entirely implementation details that are undocumented. If you are a diff --git a/data/org.freedesktop.impl.portal.Wallpaper.xml b/data/org.freedesktop.impl.portal.Wallpaper.xml index c16722a74..adf5effeb 100644 --- a/data/org.freedesktop.impl.portal.Wallpaper.xml +++ b/data/org.freedesktop.impl.portal.Wallpaper.xml @@ -31,29 +31,24 @@ SetWallpaperURI: @handle: Object path to export the Request object at @app_id: App id of the application - @parent_window: Identifier for the application window, see - Common Conventions + @parent_window: Identifier for the application window, see Common Conventions + @uri: The picture file URI @options: Options that influence the behavior of the portal @response: Numberic response Asks to set a given picture as the desktop background picture. The following options are supported: - - - show-preview b - - whether to show a preview of the picture. Note that the portal may - decide to show a preview even if this option is not set - - - - set-on s - - where to set the wallpaper. Possible values are 'background', 'lockscreen' or 'both' - - - + + * ``show-preview`` (``b``) + + Whether to show a preview of the picture. Note that the portal may + decide to show a preview even if this option is not set + + * ``set-on`` (``s``) + + Where to set the wallpaper. Possible values are `background`, + `lockscreen` or `both`. --> From a973257bfb51a0d88ac17a4fbca1519dbe512a20 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Mon, 20 Nov 2023 16:42:40 -0300 Subject: [PATCH 28/82] doc: Add and use target for window identifiers --- data/org.freedesktop.impl.portal.Access.xml | 2 +- data/org.freedesktop.impl.portal.Account.xml | 2 +- data/org.freedesktop.impl.portal.AppChooser.xml | 2 +- data/org.freedesktop.impl.portal.DynamicLauncher.xml | 2 +- data/org.freedesktop.impl.portal.Email.xml | 2 +- data/org.freedesktop.impl.portal.FileChooser.xml | 6 +++--- data/org.freedesktop.impl.portal.GlobalShortcuts.xml | 2 +- data/org.freedesktop.impl.portal.InputCapture.xml | 2 +- data/org.freedesktop.impl.portal.Print.xml | 4 ++-- data/org.freedesktop.impl.portal.RemoteDesktop.xml | 2 +- data/org.freedesktop.impl.portal.ScreenCast.xml | 2 +- data/org.freedesktop.impl.portal.Screenshot.xml | 4 ++-- data/org.freedesktop.impl.portal.Wallpaper.xml | 2 +- data/org.freedesktop.portal.FileChooser.xml | 4 ++-- data/org.freedesktop.portal.GlobalShortcuts.xml | 2 +- data/org.freedesktop.portal.InputCapture.xml | 2 +- data/org.freedesktop.portal.Location.xml | 2 +- data/org.freedesktop.portal.OpenURI.xml | 6 +++--- data/org.freedesktop.portal.Print.xml | 4 ++-- data/org.freedesktop.portal.RemoteDesktop.xml | 2 +- data/org.freedesktop.portal.ScreenCast.xml | 2 +- data/org.freedesktop.portal.Screenshot.xml | 2 +- data/org.freedesktop.portal.Wallpaper.xml | 4 ++-- doc/common-conventions.rst | 1 + 24 files changed, 33 insertions(+), 32 deletions(-) diff --git a/data/org.freedesktop.impl.portal.Access.xml b/data/org.freedesktop.impl.portal.Access.xml index 11bd2c802..4fe3f5412 100644 --- a/data/org.freedesktop.impl.portal.Access.xml +++ b/data/org.freedesktop.impl.portal.Access.xml @@ -32,7 +32,7 @@ AccessDialog: @handle: Object path to export the Request object at @app_id: App id of the application - @parent_window: Identifier for the application window, see Common Conventions + @parent_window: Identifier for the application window, see :ref:`Common Conventions ` @title: Title for the dialog @subtitle: Subtitle for the dialog @body: Body text, may be "" diff --git a/data/org.freedesktop.impl.portal.Account.xml b/data/org.freedesktop.impl.portal.Account.xml index e584c0c74..a272a058d 100644 --- a/data/org.freedesktop.impl.portal.Account.xml +++ b/data/org.freedesktop.impl.portal.Account.xml @@ -33,7 +33,7 @@ GetUserInformation: @handle: Object path for the #org.freedesktop.portal.Request object representing this call @app_id: App id of the application - @window: Identifier for the window + @window: Identifier for the application window, see :ref:`Common Conventions ` @options: Vardict with optional further information @response: Numeric response @results: Vardict with the results of the call diff --git a/data/org.freedesktop.impl.portal.AppChooser.xml b/data/org.freedesktop.impl.portal.AppChooser.xml index 3bd9834b2..155bfb233 100644 --- a/data/org.freedesktop.impl.portal.AppChooser.xml +++ b/data/org.freedesktop.impl.portal.AppChooser.xml @@ -33,7 +33,7 @@ @handle: Object path to export the Request object at @app_id: App id of the application @title: Title for the app chooser dialog - @parent_window: Identifier for the application window, see Common Conventions + @parent_window: Identifier for the application window, see :ref:`Common Conventions ` @choices: App ids of applications to let the user choose from @options: Vardict with optional further information @response: Numeric response diff --git a/data/org.freedesktop.impl.portal.DynamicLauncher.xml b/data/org.freedesktop.impl.portal.DynamicLauncher.xml index 9f6b78a27..110d39b2c 100644 --- a/data/org.freedesktop.impl.portal.DynamicLauncher.xml +++ b/data/org.freedesktop.impl.portal.DynamicLauncher.xml @@ -30,7 +30,7 @@ PrepareInstall: @handle: Object path for the #org.freedesktop.impl.portal.Request object representing this call @app_id: App id of the application - @parent_window: Identifier for the application window, see Common Conventions + @parent_window: Identifier for the application window, see :ref:`Common Conventions ` @name: The default name for the launcher @icon_v: A #GBytesIcon as returned by g_icon_serialize() @options: Vardict with optional further information diff --git a/data/org.freedesktop.impl.portal.Email.xml b/data/org.freedesktop.impl.portal.Email.xml index 81d47a517..d0401e974 100644 --- a/data/org.freedesktop.impl.portal.Email.xml +++ b/data/org.freedesktop.impl.portal.Email.xml @@ -30,7 +30,7 @@ ComposeEmail: @handle: Object path for the #org.freedesktop.impl.portal.Request object representing this call @app_id: App id of the application - @parent_window: Identifier for the application window, see Common Conventions + @parent_window: Identifier for the application window, see :ref:`Common Conventions ` @options: Vardict with optional further information @response: Numeric response @results: Vardict with the results of the call diff --git a/data/org.freedesktop.impl.portal.FileChooser.xml b/data/org.freedesktop.impl.portal.FileChooser.xml index b539aa1da..88540ae8d 100644 --- a/data/org.freedesktop.impl.portal.FileChooser.xml +++ b/data/org.freedesktop.impl.portal.FileChooser.xml @@ -35,7 +35,7 @@ OpenFile: @handle: Object path for the #org.freedesktop.impl.portal.Request object representing this call @app_id: App id of the application - @parent_window: Identifier for the application window, see Common Conventions + @parent_window: Identifier for the application window, see :ref:`Common Conventions ` @title: Title for the file chooser dialog @options: Vardict with optional further information @response: Numeric response @@ -117,7 +117,7 @@ SaveFile: @handle: Object path for the #org.freedesktop.impl.portal.Request object representing this call @app_id: App id of the application - @parent_window: Identifier for the application window, see Common Conventions + @parent_window: Identifier for the application window, see :ref:`Common Conventions ` @title: Title for the file chooser dialog @options: Vardict with optional further information @response: Numeric response @@ -196,7 +196,7 @@ diff --git a/data/org.freedesktop.portal.DynamicLauncher.xml b/data/org.freedesktop.portal.DynamicLauncher.xml index 0efe5ebac..abd5771b2 100644 --- a/data/org.freedesktop.portal.DynamicLauncher.xml +++ b/data/org.freedesktop.portal.DynamicLauncher.xml @@ -99,7 +99,7 @@ @name: The default name for the launcher @icon_v: A ``GBytesIcon`` icon as returned by ``g_icon_serialize()``. Must be a png or jpeg no larger than 512x512, or an svg @options: Vardict with optional further information - @handle: Object path for the #org.freedesktop.portal.Request object representing this call + @handle: Object path for the :ref:`org.freedesktop.portal.Request` object representing this call Presents a dialog to the user to allow them to see the icon, potentially change the name, and confirm installation of the launcher. @@ -109,7 +109,7 @@ * ``handle_token`` (``s``) A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for + object path element. See the :ref:`org.freedesktop.portal.Request` documentation for more information about the @handle. * ``modal`` (``b``) diff --git a/data/org.freedesktop.portal.Email.xml b/data/org.freedesktop.portal.Email.xml index 515c7dd88..15d580d6a 100644 --- a/data/org.freedesktop.portal.Email.xml +++ b/data/org.freedesktop.portal.Email.xml @@ -33,7 +33,7 @@ ComposeEmail: @parent_window: Identifier for the application window, see :doc:`common-conventions` @options: Vardict with optional further information - @handle: Object path for the #org.freedesktop.portal.Request object representing this call + @handle: Object path for the :ref:`org.freedesktop.portal.Request` object representing this call Presents a window that lets the user compose an email. @@ -60,13 +60,13 @@ * ``handle_token`` (``s``) A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for + object path element. See the :ref:`org.freedesktop.portal.Request` documentation for more information about the @handle. * ``address`` (``s``) The email address to send to. Must conform to the HTML5 definition of a - [valid email address](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address). + `valid email address `_. * ``addresses`` (``as``) diff --git a/data/org.freedesktop.portal.FileChooser.xml b/data/org.freedesktop.portal.FileChooser.xml index 51c2849db..0c35dcf7f 100644 --- a/data/org.freedesktop.portal.FileChooser.xml +++ b/data/org.freedesktop.portal.FileChooser.xml @@ -39,7 +39,7 @@ @parent_window: Identifier for the application window, see :doc:`common-conventions` @title: Title for the file chooser dialog @options: Vardict with optional further information - @handle: Object path for the #org.freedesktop.portal.Request object representing this call + @handle: Object path for the :ref:`org.freedesktop.portal.Request` object representing this call Asks to open one or more files. @@ -48,7 +48,7 @@ * ``handle_token`` (``s``) A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for + object path element. See the :ref:`org.freedesktop.portal.Request` documentation for more information about the @handle. * ``accept_label`` (``s``) @@ -133,7 +133,7 @@ * ``uris`` (``as``) An array of strings containing the uris of the selected files. All URIs - have the "file://" scheme. + have the ``file://`` scheme. * ``choices`` (``a(ss)``) @@ -159,7 +159,7 @@ @parent_window: Identifier for the application window, see :ref:`Common Conventions ` @title: Title for the file chooser dialog @options: Vardict with optional further information - @handle: Object path for the #org.freedesktop.portal.Request object representing this call + @handle: Object path for the :ref:`org.freedesktop.portal.Request` object representing this call Asks for a location to save a file. @@ -168,7 +168,7 @@ * ``handle_token`` (``s``) A string that will be used as the last element of the @handle. Must be a valid - object path element. See the #org.freedesktop.portal.Request documentation for + object path element. See the :ref:`org.freedesktop.portal.Request` documentation for more information about the @handle. * ``accept_label`` (``s``) @@ -223,7 +223,7 @@ * ``uris`` (``as``) An array of strings containing the uri of the selected file. All URIs - have the "file://" scheme. + have the ``file://`` scheme. * ``choices`` (``a(ss)``) @@ -259,7 +259,7 @@ @parent_window: Identifier for the application window, see :ref:`Common Conventions ` @title: Title for the file chooser dialog @options: Vardict with optional further information - @handle: Object path for the #org.freedesktop.portal.Request object representing this call + @handle: Object path for the :ref:`org.freedesktop.portal.Request` object representing this call Asks for a folder as a location to save one or more files. The names of the files will be used as-is and appended to the @@ -274,7 +274,7 @@ A string that will be used as the last element of the @handle. Must be a valid object path element. See the - #org.freedesktop.portal.Request documentation for more + :ref:`org.freedesktop.portal.Request` documentation for more information about the @handle. * ``accept_label`` (``s``) @@ -318,7 +318,7 @@ the file names may have changed, for example if a file with the same name in the selected folder already exists. - All URIs have the "file://" scheme. + All URIs have the ``file://`` scheme. * ``choices`` (``a(ss)``) diff --git a/data/org.freedesktop.portal.GlobalShortcuts.xml b/data/org.freedesktop.portal.GlobalShortcuts.xml index bfd2d7b1a..8d6802e10 100644 --- a/data/org.freedesktop.portal.GlobalShortcuts.xml +++ b/data/org.freedesktop.portal.GlobalShortcuts.xml @@ -45,7 +45,7 @@ @@ -98,7 +98,7 @@ @@ -77,9 +77,9 @@ @@ -64,9 +64,9 @@ diff --git a/doc/website/android-chrome-192x192.png b/doc/website/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..c7d6e45cadb10a90f5c5a5da1ff87866bdbc559c GIT binary patch literal 9350 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 IN|}cIF9Z=B8~^|S literal 9315 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 diff --git a/doc/website/apple-touch-icon.svg b/doc/website/apple-touch-icon.svg deleted file mode 100644 index 9256868bd..000000000 --- a/doc/website/apple-touch-icon.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - xdg-portal - - - - - diff --git a/doc/website/favicon-16x16.png b/doc/website/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..caca24d3f0bc7ccf76c4f919c8de75d206d4712f GIT binary patch literal 981 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>-8yZTN7?6 zF_y$&Ar~tiHyhrpXkmG2R$)PA9W{>S{qheFYTntaF}Gb-Lz!J%ghfVzRYjit)^3eh ze?e_k4oww~)NtY3do=VlIi zzDmWxoToHJbk_nUEftRY`!%=DQ8d!#+%!YM)1LS2dQ}B!w*5<#b=5fzFIQPRMIk#z zWX)uGDuAVHvXQ9%z zIf~_JVrF_=ZN-xR|NmcY)&Ch7Sd1k>e!;(F`wpjoI7!~_E;(ly4XlA2&H|6fVg?4j z!ywFfJbwj91$&97uPgg=ZZQT?-X3G6M4-?^PZ!4!iOb0e2`o%%X<}h!WdhxdXP!TJ z!o-v(w}GSM{Mn$J;5v}AoNT~P*iyO1eR`th95zfj5Za0;_6ZmWK;9gQ%w~O zH7(`!)y>t*lVyw5i?gj|c2-Un4mK`k)Z=Dz)brNP&XZ=0wytJ(_tq0*6Vp@I&Q2FE z4L9d5=l9psXXDn3%a@P053m2*;Nb4QPN6M9f8B%&8$NWLSn*;;#JU|73%34?;q1KV z`R~z5&6qnf3GF|NmoD2Wy_%!phrsgc!jH?+Es81&9sV*2F*aH7wUjp-Z{D-%@xdB~ z|I-ypc2?bR0D4xn#5JNMC9x#cD!C{XNHG{07#Zst8tNJug%}uE85vp`8fya?1_tv4 zdB31&$jwj5OsmAL;l0mR51h*rdD+Fui3O>8`9xlq$-qD7Nja<7L+72FjUNW{E3I7Fib<^l>g~7o=<}qn3cKp zlDUPIg}o<>FbgZVG?*MtVOHK8qHy}gl@mwK9FaM~e!9V9ftMb`D{;Y+Pfn&&fmSeh My85}Sb4q9e0OD&os{jB1 literal 0 HcmV?d00001 diff --git a/doc/website/favicon-32x32.png b/doc/website/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..556f8aac1462b6dbeb37b901f3ca68f849603033 GIT binary patch literal 1544 zcmZ`%do&Yz9RKZM4|~{*%`>yvY;5jKy5-8N4Pzd6+&oGi+i2Hou}l=&DXvnwCU---9PR*-|zSHeSN;)Kfd4M&|p8Dp@ks;04MSn zNc2cuQWQ*Y1r57y=mDPO9pnu_TPfySyungY>MscbAcqM+!43ev=u-ug0Bq&~FdYYg zTQvX_WliU=?f^i^q2h4i!U*?Y={!P9+hF4FffKl4WowO_%4|N~<=($w@9u)p58*IT z!&+ufqaBF|H^RZLAEV!BvLhP7@K{*aF?#oLdhifebz-67B*cgSf{g{j)EIubj@DX1g+RdS<(M1=MdXRQ*~~yAp=PG=3x{a+yO&|m z(81G;S%j&ELzHK)~v!J3?Kuoj4U}hFNN~3!(Mm7j>ksdJICA*N=%P6ne20X z+0BMRL8#EEvD5~MfSj+fT^~Y}N05qC<{qw?xna&w8#5!pbiA8=?x3yTYMie-t}xR) z$OqqliV@~#RFFmq^u|Yt2~V%E-VQk4Im`4}iH!~-%-rTY>SV!Tkgds-Q~RkJrCDvU zb>()e{8Y+lyFGmwB1>-i6B}(zfU)Vw**l!6n~rT&)T>A7LU&whjEN%y<-$Qj0O&nw zN3%wx#F)J3Vq2LR@Ey^wdK}`yj8Fb)lN3erUybwn8GHK-Ggm?0l0;4jH;xP>G?&?o zoVVW?MGEl3FD@>g>VEE}zdBSU2@ac{!i<(^^bsT>&`;2|TzYuv6VXcls7wH?iqkP!I>Lk6a}5*J#$eu6+G@D5)&u(=!)A@L^kT@dk<5?jJeLoLho#3Zf4 zS6(cXILIw%zQ51#c)4-%O4$OB`%Yw}{q&XIo=b5Gyjzp0{xr0xPJA;sM1X3zoY0dP ziUMv#+?-16Z@(C6cebxgB0d;gYZRH_)mtK8gfgwe1}l$E@aq;WUwq+btv|em;QYfd zxwpUnx8~HBT*2_e2JQM}GOFx;^O?>YO)*L8mOfmRhV{kw4HMlpQ6GCMSL+knC6nc^ zQ?09O&9lsDpBY2re3O`A(CE*vV=h{9_DrTe)>5{8J@P1)8_`k?{rYICpwS@u2^6Ui zPwi{{&f70Ve#mugD1Ybb$3w-`r41M5?)A}a6Hm{7x;2j~%UkQYv3uM;_^@UqPv=5b zzKD8{XvhrTRYvZN_DThg_^!{P!bV%d?s4kq_)c4g7`v)TH+Ylp@VNY_ zBxchOu-i*RJagQ~drxXS8k5LhX3^Qr)z@}EsEcs=7`7GRVtwxTop;0U@@)59m2HSE zt8imzPrsix(@j4Ef@kf*xZu32CiyK76v5)hFI&~P4|NNl-g`T#M6Wwm%{o8D*Lw66 z)Hhldl41{B8_L%*yhdHPeZ|Xu(5C}N=EU}6Z7a%S)1G9$y!5@u!H zAp7V0e=-cz`K<%}>gFVdaFw76Yznpt~IPou;{>2z7VWdhHuadh-Gvs;z zd>-G0>+Hr*vx}qN;qeX=aUcIfNKKb161V(6VMcu3Ur#V!+7OnWs8Yvg z$bnj|c2cAzXG-Iha;Nl+q=SFETj-l2a>653l6W;$nUS8TNRd-jTaCLcaotgu#MVpE%7wmlZ@0 literal 0 HcmV?d00001 diff --git a/doc/website/favicon.ico b/doc/website/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..158a9640b28fdc42399e79665c381c27af4244af GIT binary patch literal 15086 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 Bek%X~ diff --git a/doc/website/safari-pinned-tab.svg b/doc/website/safari-pinned-tab.svg new file mode 100644 index 000000000..d3a4714d9 --- /dev/null +++ b/doc/website/safari-pinned-tab.svg @@ -0,0 +1,47 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/doc/website/site.webmanifest b/doc/website/site.webmanifest new file mode 100644 index 000000000..ae7a74ff7 --- /dev/null +++ b/doc/website/site.webmanifest @@ -0,0 +1,18 @@ +{ + "name": "XDG Desktop Portal", + "short_name": "XDG Desktop Portal", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff" +} From 3cbee2379015ab62629c7c8e13e6149d73e7b84c Mon Sep 17 00:00:00 2001 From: Razze Date: Wed, 22 Nov 2023 01:33:21 +0100 Subject: [PATCH 45/82] Add opengraph plugin --- .github/workflows/pages.yml | 3 ++- CONTRIBUTING.md | 2 +- doc/card.png | Bin 0 -> 38230 bytes doc/conf.py | 24 +++++++++++++++--------- doc/meson.build | 1 + 5 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 doc/card.png diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 02b80f967..d82172c0e 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -49,7 +49,8 @@ jobs: ca-certificates \ git \ python3-sphinx \ - python3-furo + python3-furo \ + python-sphinxext-opengraph - name: Check out xdg-desktop-portal uses: actions/checkout@v3 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a64c8c88e..18f3ec2b3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -67,7 +67,7 @@ $ meson test -C _build These instructions are for fedora, where you will need these packages: ``` -sudo dnf install json-glib-devel fuse3-devel gdk-pixbuf2-devel pipewire-devel python3-sphinx flatpak-devel python3-furo +sudo dnf install json-glib-devel fuse3-devel gdk-pixbuf2-devel pipewire-devel python3-sphinx flatpak-devel python3-furo python-sphinxext-opengraph ``` Then you can build the website with: diff --git a/doc/card.png b/doc/card.png new file mode 100644 index 0000000000000000000000000000000000000000..13747490f2925dd7ce6e87cf995a72c193bbdfd5 GIT binary patch literal 38230 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 khQt42!vAjqw0T!+mN&o-= literal 0 HcmV?d00001 diff --git a/doc/conf.py b/doc/conf.py index 7961e383f..00dbc2162 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -6,22 +6,28 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -project = 'XDG Desktop Portals' -copyright = '2023, XDG Desktop Portal Authors' -author = 'XDG Desktop Portal Authors' +project = "XDG Desktop Portals" +copyright = "2023, XDG Desktop Portal Authors" +author = "XDG Desktop Portal Authors" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = [] - -templates_path = ['_templates'] -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +extensions = [ + "sphinxext.opengraph", +] +templates_path = ["_templates"] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'furo' -html_static_path = ['_static'] +html_theme = "furo" +html_static_path = ["_static"] + +# -- Options for OpenGraph --------------------------------------------------- + +ogp_site_url = "https://flatpak.github.io/xdg-desktop-portal/docs/" +ogp_image = "card.png" diff --git a/doc/meson.build b/doc/meson.build index 7e27fe013..cb9a4657f 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -68,6 +68,7 @@ if build_documentation 'portal-interfaces.rst', 'implementation-interfaces.rst', 'background-app-monitor.rst', + 'card.png', ] copied_docs_sources = [] From 19e0caf1ad0f177726a9678223992f0bcca88de3 Mon Sep 17 00:00:00 2001 From: Razze Date: Wed, 22 Nov 2023 01:50:56 +0100 Subject: [PATCH 46/82] Add copybutton --- .github/workflows/pages.yml | 3 ++- CONTRIBUTING.md | 4 ++-- doc/conf.py | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index d82172c0e..99ae18743 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -50,7 +50,8 @@ jobs: git \ python3-sphinx \ python3-furo \ - python-sphinxext-opengraph + python-sphinxext-opengraph \ + python-sphinx-copybutton - name: Check out xdg-desktop-portal uses: actions/checkout@v3 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 18f3ec2b3..89d010c39 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ Before developing features or fixing bugs, please make sure you are have done the following: -- Your code is not on the *main* branch of your fork +- Your code is not on the _main_ branch of your fork - The code has been tested - All commit messages are properly formatted and commits squashed where appropriate @@ -67,7 +67,7 @@ $ meson test -C _build These instructions are for fedora, where you will need these packages: ``` -sudo dnf install json-glib-devel fuse3-devel gdk-pixbuf2-devel pipewire-devel python3-sphinx flatpak-devel python3-furo python-sphinxext-opengraph +sudo dnf install json-glib-devel fuse3-devel gdk-pixbuf2-devel pipewire-devel python3-sphinx flatpak-devel python3-furo python-sphinxext-opengraph python-sphinx-copybutton ``` Then you can build the website with: diff --git a/doc/conf.py b/doc/conf.py index 00dbc2162..25c3851f5 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -15,6 +15,7 @@ extensions = [ "sphinxext.opengraph", + "sphinx_copybutton", ] templates_path = ["_templates"] From 90b28de6206c9da5e2d90fd0986ff8d603036db1 Mon Sep 17 00:00:00 2001 From: Razze Date: Wed, 22 Nov 2023 02:04:13 +0100 Subject: [PATCH 47/82] Handle favicon for docs page --- doc/conf.py | 1 + doc/favicon.ico | Bin 0 -> 15086 bytes doc/meson.build | 1 + 3 files changed, 2 insertions(+) create mode 100644 doc/favicon.ico diff --git a/doc/conf.py b/doc/conf.py index 25c3851f5..d21a8fb6b 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -12,6 +12,7 @@ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration +html_favicon = "favicon.ico" extensions = [ "sphinxext.opengraph", diff --git a/doc/favicon.ico b/doc/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..158a9640b28fdc42399e79665c381c27af4244af GIT binary patch literal 15086 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 Date: Wed, 22 Nov 2023 02:38:16 +0100 Subject: [PATCH 48/82] Sort alphabetically --- .github/workflows/pages.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 99ae18743..342d7b3eb 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -21,37 +21,37 @@ jobs: run: | dnf install -y \ desktop-file-utils \ - fuse3 \ - gcc \ - gettext \ - gnome-desktop-testing \ - gtk-doc \ - libcap \ - libcap-devel \ flatpak-devel \ fontconfig-devel \ + fuse3 \ fuse3-devel \ + gcc \ gdk-pixbuf2-devel \ geoclue2-devel \ + gettext \ glib2-devel \ + gnome-desktop-testing \ + gtk-doc \ json-glib-devel \ - pipewire-devel \ + libcap \ + libcap-devel \ libportal-devel \ - systemd-devel \ llvm \ meson \ + pipewire-devel \ python3-gobject \ - shared-mime-info + shared-mime-info \ + systemd-devel - name: Install dependencies for doc builds run: | dnf install -y \ ca-certificates \ git \ - python3-sphinx \ - python3-furo \ + python-sphinx-copybutton \ python-sphinxext-opengraph \ - python-sphinx-copybutton + python3-furo \ + python3-sphinx - name: Check out xdg-desktop-portal uses: actions/checkout@v3 From 37ee32bd59b09a35c14d480ae5ddbfe85ba8d8b0 Mon Sep 17 00:00:00 2001 From: Razze Date: Wed, 22 Nov 2023 03:14:39 +0100 Subject: [PATCH 49/82] Make images relative and use plausible colors --- doc/website/site.webmanifest | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/website/site.webmanifest b/doc/website/site.webmanifest index ae7a74ff7..286e44f5b 100644 --- a/doc/website/site.webmanifest +++ b/doc/website/site.webmanifest @@ -3,16 +3,16 @@ "short_name": "XDG Desktop Portal", "icons": [ { - "src": "/android-chrome-192x192.png", + "src": "android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "/android-chrome-512x512.png", + "src": "android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } ], - "theme_color": "#ffffff", - "background_color": "#ffffff" -} + "theme_color": "#F6D32D", + "background_color": "#F6D32D" +} \ No newline at end of file From cb9be2dd78822630dfd5ba3e9f6f5d4ec40178e1 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Wed, 22 Nov 2023 08:37:14 -0300 Subject: [PATCH 50/82] doc: Fix typos --- doc/index.rst | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/index.rst b/doc/index.rst index 8733d2f1c..822aee92b 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -3,12 +3,11 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -XDG Desktop Portals -=================== +XDG Desktop Portal +================== -XDG Dekstop Portals allow `Flatpak apps `_, and other -desktop containment frameworks, to interact with the system in a secure and well -defined way. +XDG Desktop Portal allow `Flatpak apps `_, and other desktop +containment frameworks, to interact with the system in a secure and well defined way. Content Overview ---------------- From 9dcf214a0349a2d24f5ee05f3efdfe9018e1b323 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Wed, 22 Nov 2023 08:37:59 -0300 Subject: [PATCH 51/82] doc: Fix capitalizations --- doc/conf.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index d21a8fb6b..304b51a06 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -6,9 +6,9 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -project = "XDG Desktop Portals" -copyright = "2023, XDG Desktop Portal Authors" -author = "XDG Desktop Portal Authors" +project = "XDG Desktop Portal" +copyright = "2023, XDG Desktop Portal authors" +author = "XDG Desktop Portal authors" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration From 1d67a96fbcd8f90fe5ebe2cf465ce5d2c5af7e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Thu, 23 Nov 2023 21:02:33 -0500 Subject: [PATCH 52/82] docs: properly detect dependencies for documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hubert Figuière --- meson.build | 4 +++- tests/meson.build | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 05d0a5636..433f1fccd 100644 --- a/meson.build +++ b/meson.build @@ -64,6 +64,7 @@ src_includes = include_directories('src') i18n = import('i18n') gnome = import('gnome') pkgconfig = import('pkgconfig') +pymod = import('python') cc = meson.get_compiler('c') cflags = [ @@ -145,7 +146,8 @@ add_project_arguments(['-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_66'], languag build_documentation = false gdbus_codegen = find_program('gdbus-codegen', native: true, required: get_option('documentation')) sphinx_build = find_program('sphinx-build', native: true, required: get_option('documentation')) -if not get_option('documentation').disabled() and gdbus_codegen.found() and sphinx_build.found() +sphinx_modules = pymod.find_installation('python3', modules: ['sphinxext.opengraph', 'sphinx_copybutton', 'furo'], required: get_option('documentation')) +if not get_option('documentation').disabled() and gdbus_codegen.found() and sphinx_build.found() and sphinx_modules.found() fs = import('fs') # we're going to copy this file in to our build tree if fs.is_file(flatpak_intf_dir / 'org.freedesktop.portal.Flatpak.xml') diff --git a/tests/meson.build b/tests/meson.build index cedac1436..2ad392814 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -282,7 +282,6 @@ test( ) pytest = find_program('pytest-3', 'pytest', required: get_option('pytest')) -pymod = import('python') python = pymod.find_installation( 'python3', modules: ['dbus', 'dbusmock', 'gi'], From d85764da6c272c320f439e75a281fdf4a80ce045 Mon Sep 17 00:00:00 2001 From: Jakub Steiner Date: Tue, 21 Nov 2023 15:46:45 +0100 Subject: [PATCH 53/82] Add custom styling to the docs pages - Add a pixel art header - Improve the sidebar - Introduce new font --- doc/_static/inter.woff2 | Bin 0 -> 345588 bytes doc/_static/xdg-portal-dark.png | Bin 0 -> 3927 bytes doc/_static/xdg-portal-light.png | Bin 0 -> 4817 bytes doc/_static/xdg.css | 442 +++++++++++++++++++++++++++++++ doc/common-conventions.rst | 3 - doc/conf.py | 4 + doc/copy-subdir.py | 12 + doc/index.rst | 5 + doc/meson.build | 14 + 9 files changed, 477 insertions(+), 3 deletions(-) create mode 100644 doc/_static/inter.woff2 create mode 100644 doc/_static/xdg-portal-dark.png create mode 100644 doc/_static/xdg-portal-light.png create mode 100644 doc/_static/xdg.css create mode 100644 doc/copy-subdir.py diff --git a/doc/_static/inter.woff2 b/doc/_static/inter.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..22a12b04e1abd959c00f9d8429ca78ddae3f7dde GIT binary patch literal 345588 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]mXuNBTWGrv1#M1=!~m&>AzOjt3<_o)Z${&4^RXASioa zNS=di=>VfbfxHU_wh|HQohRBA>T#~Id5kqUGn6*0Jh}E0b!|b$vjx*nUFbp;R6#4GS-J+aPmb*fEE%{;sUjVu&-OHx7lm%C zP~5OB0Bu`0^?i838QDWz!!=*I95rBwD#J_T7p^aF?PX5%uQKw!pTCi#EV!Q{uvy=t z88xCW@4Pe*$YR))0AJ|up@w7}8%JMo+ksbH*z<6Uw%>}@a?>~YdQsI{P<2C-`w#d8 zaiuT$gH>5mPtbZP32IBl$=olZ?4!4>Vl1z^AGd*y{oH;mNQYL));Fg zFao<|Zd8hPMMH);^Q5XHz?dA1#T3i#$eUrKIUQ*Q9MvH`|ImCv+YIvD9)U6P^ySyT zvH354@$;7(Xs5?oW8uxA*R3+eo8Bt$4t`%%U-%AuS2i#XHRm)WLE%9dT%N^+=L_() zSGvX@=)zL`v0hr>3e07U#AV;!;Y{QRU&gc0ULf67Wg~6?nrH`Q_%zvR7^W>J@~Ms_Xr?&o2gIC)k*yv+?O0~AXSKDL zG&g#V)2q^Kns2^GlSJU>(Qk)#ez6~arBOFE@G5=f9Kcm7j{c4v%>BKDF9xjx&nY#DaQhEBZ;;6a9Ghmr=t$Q zt5gyJ@G9-E0l29vq`XR?t|@j83R=?u4m8nIfTu9;x7#ZuZkK*}9Yzp@@iCh}fAS5X z3-3s%SmZLCP{<-SQBEN7tVtv9&NAumbihI4zyeRu>10HAnpxC z6|Gv7H;uWTB!SeT!e_rICsVSPTmBByd4Jk5baA<?Lsv?RrW9I56$Boz?*~46dQyi!`3w?D`$oy;UW?y~-Ti0cufmQh!a*_q za>+our~~+nEYWC9X4k}~%F{gF6}hz6z)URvT+fotsIc6Lxz601gsyPXHk#r@!T;*? zGs&*y){f>DPtVY%Uu#B(2$c4AV|qYG3$X z_W?Odo-!owWd0gE4eTb^?x5F@R#Jrx+RqxCFm2|09hS0t?SXZa%`WDw6>k;%2nvN; zN7agSHNDZ_Z$DK{rX$J4<14~`t~x#4O|SO9wXZ7$Hq#em*dp=J4K~=9p!*4PH1y2=FLU}Y@@LtAR-2TaHWghYx z)ow;VC90osv~w(Nx+y@d1^R#S_)Dzm)ag^CVSo*Djd(TWH9umeZ>uop7xV9Sk$uRS z)3KcE_RPT0O9F)nIMCVXyWzv5n|w+)e92sY7$P7IhD#7kB7rh<387a)4?>6b$0th(p$l9anYr z(Vf8A$*b_}&sVHPu1t4qxCSZz!kS*()%QPk7c!OHVYolb>j}gT2Iqg*O<*GPFZZ`H z^E?q>taMZt<+cn&Lia|g2{Vvip&b8%Hu3L>Btd)0YWLV+s`!ua#AypR0;N7AgfUPt zNzqA*sc^krE>zZw_U&8ul zoBwayylh$Q4?$PIQ10%w_b{Azw)xVwd7V?IYxlO(UiCjhk59Qgt6ZI-?dm9nFxscS z=@2&or+!|CSJXoqjL<@oV}7=`HlLN@rZS#0yRX)eNVSnq+1zZv>L$8ER1~j6mKQK*QrU>J!4t2$rB<&xx1(e%NqP4+P2qdXC5pg)3A)l-N(nx>~LstnYS|cdCa>b#Bsa| z`}J8#qFU9rV8FP%Et)&qMM>(qw=w#t8Czi6R-6R*H~ffez=HK_xcG=uNO30sJioLw3kia&rXb`;z;82uzl#|ew2Uxu(-%= zlJsr(%nb@mFm)o70|3Cktg0LT=5GFizTH$TR&_>C`&4~rSHDkcDqdAS8CUhm*f6m9 zp6&R&T8$C`O5WEm6c3sO>N2BU(Mn`o6n1@P(xgTp3I#p3spT;7%TUp}7WdCiFH&&VHLY~?fwBwl4qz1a%^)>)qvlcVta;%+NAa93qK17k z6B5nE)!tAbUEFeYXPF@Gaqj7AkR<%*qlKFR|+4n zgaj^YKZv3pe)vaK$6n!S2{F}DMbj$zJT_JJ7Hh_Uijgl`80AMEN$v(Arb_@S}m1Uc1y1xZOFzN-L!s)}kPYn)SfgLsV+b zNQg);NOm=sp@v^=^~sf_FHLijDvP45>&%k)X(9MCCn(Usf=yv5tSDQ!ixO*NL20rI zC4T*1gruU*z0?B}l$`I~T6u!dCJ4e9p1cNNdqqXuh%t1FJrLs(fnC~g#PAkb@!kVZ z#{`g>hi5&Gz*X-s9$KkB6Bh*D_jrHfQAIOSTVxW-Z{4b@@R=f+Q^)$BiY%qg@k^0= zo;?T-6r4}5+%$3}Fc zSbkDQ!uw>U3H~VvV*uN6BL*-)_*I1qNEM3}RV|hCxqPu;C6hCuGc{KV`J$?3%zVC3 z%x5Vj4P#^^w`S~*n*MYuB|6)SP%&~XF_;R$t82@-yC4Q?4ojlGK1vzoR670eVam#S zUR%fZGga#%xF;`6zDH37fg-YDy~E@B^cRm*)wU1DMu(#VVHJQOYuTPB<}hZ5my~#D z+F46(DH%Dj2Ft@)Y(UelIsq&yg`p{Iy!+sLPh%2(h6nLv(k}_eOvTk$9Xwherqs$s zGny>bhWm{8@o&s|ZC+T7<`^ec?I}p>4kSR@U9PkgfCa4~5z6o%tp?XT<;1htRkRQW zp{TA(0G(0$1D-$Ds$}P28;66W+_EusI@>(L8GI4X+14?9k*ZtKht$u+tX|#WQ;a`= zyE1at2A`U`jK$egOU~m|zKczmQi&2i(%6~R$i)RU?KIoTPkVB>6h`h4B#l7Ln!D)u z4apXSc+ogoVqrC0O$f+1hMwE6;{E6~)X$@39te!B-K<*>2WNYP8%D!R7W{)c_tw!8 zgz7N%eK8N*+CqZgSkhhSQwfBY?%7N=EQ^8cDwotn32iXlciNUKVPmt zTPpviXjk_J=bOXI(|w?smch`J4;v;obeDsz$05F=}Ya!gszJX9`w31OVV5p>z$jzBuKpa74QjMSxp~ zYl1`FSAFY;vm)n$)G3EhY{D3$TaKrfRw^s7H4S?{xvR@K+L4+>imcJL?fM!8tjeYf zgV9kXJf<3j9^KUoPIe*66#vO)Ba&PSvGsUBYmDTn@UZ$oOqb<@0v=Fov~RqWR?ph@ zI4h)h!60!;4T0Qk_wXxI9Oyn73F_~&;ide~Eb{~~e81*0E?(@Q+IK{a=$-uVKUKCD ziOj){WNlzNM{i>L(k^9wbu-$nYr222Qm{wmOY2w42N%k>s*7=96E>rBYcMGqO=2sf zq70kx?i7cZSwqt|1Y(0bLfao1;K*Cf0uJhDE%M)IGKo@j1g-!u6auMoJrRsRg@FBC5D9RK>X#O1Aea9F?AxWIG% z>nldiN5_6O>gwvrr!Q}u2|D?^WPS70Ca6wlQDt?J8}#{K209VOB1kE=u$w2=1e^!ACm=Im6#=L&eFnmGcwpy(lh1>r2@ z)dPGB#_r9Y7#_mYP|&f@;8|RJF$jnnB6u-w9mdNrC!(2&E;*yrg2;7cHOi$|Xo{Am zSESIG@X6fUyE;R(F4M7josIYpC@Yy%MgfIL=>CQ3;^I%_gIrQYq?weN@>V9}nfeaB zSC7!}IUsPJq#$QGCgv`tH(?y#X*18t{Vj8v&VcY~vV)t>OiZ0$G@|IssIc11{TYUe zS1a1Smilxh)AlM#AJW1~nye|vjV4ULR*-#C0mX|RFc5euv^d$8t>?l&AZrw#fG5FA z4jDNHsye$QT#Vx0lJ8B9xno%Ev|gg$qihO=pN&W`?|4qH+y1kf9_#+iW#Q8*3l5dR z(%_wO|C>Bm-|vvXYI4kKSYg~6gH!n(UeAqK(d@tMREu9616KI|I(8>@t6?m+(rPRM zCG}DO1NRdZ5|o`~0~OO3jW1UqWYt`%?t0CQ`%#~!`c*4z1%yo%8Nw|Y5!iN5c+xe% zBNIyd6u3%AsdRvR(kcWfL33lMrxXBzPHEv;fLqb2{?$N2ovr<*b9c%yur5j>RTxoy zcR&DBz}VisPg?JS;tzM$o|rp=n94|C#Rqi*I8}3%iCD-5HeUHB0^`#{cJFZJW> z$6r&kp~34nuSlu3Tp+#-2`;sF$H~>y3Hg}yvhVYIH%zARpSBAY@O|~OW3rqlF-bT- zapCykFnnsU<{3^YU|=tLTO#{bL0%5?h)sxU!(uI zo6uvA=K5H1J^sRqrnt!jvmA*wStj7Ap$?RIeYf8!Zk;(JZ-x^vMsguzL-k4Qh3k*)g1${pQv%?UI4 zu=LM;#>$cGw4rDxi@_yB(Cdz2z&#rSY?S3r0_( z8e+7$JJ)vB5}l3{K9{puSG*37%Adh4Fs^$(4DIW`oUnAwYQT@{lmp;KM;joM^{@LAG>E*nqBRvmQ7kK4g*QxCu9NJC$Eqwnf$U+T+| zs(+YvL)^~Iyp*M(uC3uAZtfoa?}rg@g=1UqeEd30fDPF$Z5ssyAG$Y;KmM_sEPYLK z|3X<`H~t_pSqC|r=*cU-XumqoagMTvZj_SS2i=rD0SW?IS{eLrk`{CDZmN^uEbC^& zVx1Pk`=H?K0kdSkp#N<1Piy~c>;hutTzhWGgt6POR;lc4#=brz-*)Z3$baTY@&ERb(UQPp%#PP}+{RMvBg%KMCHv{q|2+wFef z2o9I!B(4$G9_d%VQK|(a3H)mCeN>_g>kjB<|pac_; zhrCKmVH$}C{I?#Lms5$IdU7W}bNFTt*xc8z*xxZh_1gk^x4t5Sph)X;Re-TvRJzo# z>SBJRx}bi!uQ&g+MR8|OBN&aya8T1yC4GO~ z?#oE?ZTVrH8y~16q-a$@YSt}XM6lgx#$z!9$Kc3H=fYKc7l z3JyR`Qs311l3Q7~rk_o(Yo~g7Am(5%RZ0dP(D$oa&|l3t@mV7#P3qke4t#QTrsd7s zL2VH?FM5g))hG57gAmWbLaE0#DZ3D}%_0i=6X{TAU+kl%@df{)@aUL)?_hEvnespF zd{bn|roj43Cna%VD-1jU$eGGu@8Ztu(q5 zEC2>ZFkPXf`C1M~yf$jVdQFOOa8LG5tvEVg-D^ZE8Z0E|4!;5+Jxe>QHIUZS7bB)Q zY6bND7rneDO14&MK}i3QJ2o#4dx`@ux3!hmRE!-?AaHz}bh)B^|RdhOh~LYpRbLH*H< zQtx{l9idUXs5?4Yfz~x-3ii|u7QSAJ&z8qd6#432yxCq)`$KOw$Dq$O;*F>dN)%?X^XWZ!yO8P`JlzrS}XXr6~OZZvwmb4+jA zu+U`}h%KGb5mnRhReqks zwSg9q{V6Gs&hCf;m*6ry8JFOak5sJ&KQdml>DcI$rMI_By8%bkjJxO*4E=C?=rtn24< z;8#gw`MGw)f27r`9~ti>tzP|=;o%MVHGCMa!|M$>+YGA7qowWXc+evOJ*x$e<{1hF zj1^cGnmUHnOR~MLTJj!A5!)uq1f!lnaJGNDgBYHdK}%J&Lhu>o0HFfIy-Y?~9F?PJ zLkc7C9`fGYf{Xlp9sQ9+>dOLIcw;mY6DSzh=H#>?Too&C3nlvufyL$(p>#~^JL(&c zyzEPgG%?8iSL$HQvb8sxF(^~2yOinc?}%co2MbV6>A_E!f+8j2o^NDVH3Nf&H^fXz z4V~W}IRoOceU7cT^U)T7V;+m7?8}jRW9?fr$@lcVCXV8ODp%_B4viD(pdf)*H_+c9 zgDi=pOfOdg+TO=Tg?882<&~)!JiBF9+sC+;=W>)T>e&}{EkDX1OMYy%22tbvN~Hm~?V8LaO@lG@#B>}eNJ*V4b)MHx(r@;=LV9`u1dSfG=P&A` zcjoBNrAQ$+(zqZ%w=1pb4l+|cq7LL;?lw0ufTsYLRvTxmon3p_Mf7{aSI zFhtlxE>3A6k}Pp#yN-xZ4(65kc-d4>!4i}G!`WtQt8sm-jQzLd5H>9w#nGl4Bd>%r z+iK|;La}!ftrf?1p(ErNPrr%s;OO%c0XHWzI5BmB;ML{8lGR`P?_;O^3pQZGnm2W!x@Cv1@v+@i*f!g{;+P?na-=&+ zElm0e2?XRD)Lne>TFoXmQXx?GTgPCGT(ZHdJpe|5Tu5;Nn9pS7J!-%}DZ?S$RHMGO zQqGP#91@oJly%-rVRKxh$JRaSbpv-%TbC&gr6}_bb4Mc(jo050D6eHr+lLeR{MV$` z$-S{ZGj`w5coPj}KB6>kYXUZ1lv8Zr*;u0^>C5=m)zYt>Z z9>1_RI0bAwC(1*Bg}S|!MZ3BBj;u~v2)_q!X!r+WQ@0gF=WjZGJ>RhiS>})unA3!9 zkJ9qNqWAKhi?)lqn+>*JpNh|C4BxC=QJb*@KAK#i1Z+VWs$lz_nwU7~^G{i2*@|t^ zqz@u5ierYMa+#M{tVv+yO>9J1`k|mCR9c~C#deU5N!7p6oI%-;h$-@l4J}D^1l)as zW48LG19WPxSn@2g2ejUx?i<@PT&1&xoN;sHuX&FsR%*5Eke387a~9%hRGJt?T4(H> z@cXAf1#1Aj7H`A@c)AEBG-a_x%yK?oDw~n28CKvj&@Bub1Kl*1?AWvnl{rDCone5H zM`1_=GW4ODh5hnY6&v6Ln-dsa@CJ%9&%wC7@pGLQMssX*VbLh*Fh*=;0NUb{S|GJyg^HwpydB_Y9No z{mR@LcO?p*2cHio=yPRjlzfj0YMHV3(O6I$_@M6X@Gm5`_#({WJlDN{gH1Suj&aWP z>P9UfuhM%<4G$kxdlk>l)INXTpOVoe;#&6t79<2q9VcFUXJkdMNI2Wd?@^0_nKs$2 z*48m2a8WK=+-kEfs#X{Vo)dU=eaD83uJ3wFa;!UE$WWS{rC+-O6eGCl>L&xV?WQQ1 zI`2K&#m0x>F_Bc#rGa(ilCG=DG)oeBmJ>u#U>T8d3xVT#Vz$+eODKj~n*kO_Y%A)L zQKkhV>u%hhs|BeS-@Dwq5|%6SK-?mu2-BU@H+_xwF+u_b*u?khj@;}ayWlb4v;SKK zrmp-I_UG(CevM%aLbvV=6Wh^;994C4=WOrgO?IMI45D%UsR{uVQpl&K3=po$3*eyj ztQYms-!(RkX@y%?-r5T_?QhZ~M-Ln%9}rWY?C8>P50voPp;+Gdl`@AmVYAs=gUO7! zb#wiSH~pi_r?}CUG;dLRS(NvB(Y<{z!2~yJlAwq#5P)iZpq1D4ToJRcv!4H`Klq!4qU9fOZKkVx)j$@cb57P}Tdqnr0y;c{yT$>j%tU%m(Dni#R z)Bd1D07+NhYdn7Ym)QxA07>owI2>L7^>ftaXI$vBJtP46-_gDC7;*m#x=>qFCXPS2 zQR=!V57K1fR3499-v6vaH%w%YI!_J*9NbLVZTXS< zzbB#hx#`CUPPrsf$I^j&a*eFC5rDWAOWdgB+_LM19Neo< zSe%Ve3*()MSFO0vVdQX zKcnaFSRPddV5q?)t?i<#QOti{`19g!Y`AW_@Ao*zPL0hUkF#4Bth8+W*x78e52?Jm*}Gz{!m%mNi9X&%8Jh{9VWqzwn&xbE zNlb`v|10Z7OsiF^OPuwGR%B-z&IM40sY)P0Gl}PfLMAX&S)dV;hN>FmN`u-ulSSdc zOF1jHnS`9xH7`~&a1EYeJd(AVeOQZ3{_SKcRR<4SIL~fy^pG*{J=FNxIy2eJs*qKytK09f4uq*Kxzj9nBY3=sHFm1D``| z)-C*)cGZ?R?Mmy|vSjJ@Jc?Qu=UqLis>i}D_+;6dDGy&L`0@ubkG$6YO(c}+Ou1IP zEuUK4U4((7iS&_o+ti}~fcW$PeQ$uH%96mo-N$E+{ zITGjf%@%0q<*&#!V5dNjd075xlxx6FJA2N4d4^mAb}S&^VuvJO7vG29AE@El@YmzM z0q{y|82*q@=+h-SVC9gf>lF*+>51ObhnrhU7xvWEsGfzVMzW=Lj{4aPXandAzeTEh z;F)F4C)tZuM_L)Lcy{VOc5X)NDg0EGY^xV8{Pxp8|D@Zv3u))imZ~*0Wu=5jlU$5O!%i7~3Ud5d zzp@TAj6|uwvv>cys?F;+RdeU4FW1|teax+L4z=-9Xj=IUGx#C|xRCRFohA3nL$pXn z4Vo+V!TV`cHd`Blz^r?~>cp0DUag9uS*-<%HHoL;91)uNJEmR@_#^M9%z{MMhF;2~ zmF?yj<3lxyB~Q?>aj@mqVLais+{$lXY3L>}h+#CL1v<$oplnQ$rI;quu+{h$fp(#) z9GjMB+gz}cU%RF_8yV*Y={I%u!yB4Af#AJD*439O6pJ70H#ZYzXyEy|ppo~*zuDT* z4g^Mmfa>0IK#i0=+_B9Iu2_muoS{L)0yyHd0&V36xd;KaJ=b*cOHt3NSES{Ahw3U5 zqK~#5?3jIq888qaL5110U{WNRKZPf|-`wVZtwIT5L91`@Z!MJ2SQ)&0hz>^pRjOT< zMc`QtN`3(x34SEPU!MQd;_EQ*M+z~;(p2A_#vF+b$VEqNux&ISqp4jOU%(8sVXsn3 zVonN|icl6=TieXlc}@$eg%TD%P*c_koe6Pi({>lj>3QqP=%Z0~tY2v~huFtjKbj8p zXvo)a*k>i+%hD+8Ne->Xaov_5o=JLW>>mzV3q?EsY3%a2*`3c6Tm~X!Ir1lEz={7P z*$4F?vyn06LG+FT`o<)_XpnS&Ou&lvi=iWjgvse)ReNcGF5#IeFy>x%|8rYG2rKEC8AHc7s1l)ST7?teHZ9Z4&FE!hGehB|R)Xs&G^T`8 zXf^{HW-;CsYT_?Z)*ce(X0&`!^Rf8SSUk3zOpl%3cd)EXwYsf(Y;!g>b$)z!eC43A z1a5|IKGs!@H%xWQ@Nlrks~Yc0c#JFCy)1puT50l>kCXS&0vhAR!egkAA%a&*Wqq~M z%TE!&f`#^>_4daBT~%Wm2Qf-k8$gGc?7~(bUvCYuhHrpt4=4HD~_zrJYFTcb4Rgs|Eg;~J)|6jE}oJ$xiXNy_|fdR%$-?E8;MP79YzJ6#X#t(-ZX z-imKuJX$_{2O_Q&1&qIZ7BsBnXe0A>l&bj3Zs?g=>?j=!u8=QM3&e(&i4w-mw&DUO zGB^cY>+$hsMJd?w6)Cm_=USc&4Qm(hAOaU$3VX65VOcM^-J_feH4>kH9zvum!RTY^&qpo*s>ib~F-v7S$E5K|9zdAV3qGtTsd=-aZKM#O{Pcez-VbZAYJy3OQ>6KzxRV$?uA;@eJHn%I|aLgVh zxRk_&2%mmYU0M0ypv1~dW3HWH743C(E_F@S>Unj9{M2HadR(&n{*MAZpYc?M`LlkJ zU&gbjPwwiXXQ(whNr6=Wl`sH*(M_B9^uf0eK)MoKGPfzzEps1=(A4y4BSf)4OOD%S zciON$2z}e}qk1(AqgqW$RAz#il#8**_cidu8tF2c^}ZYuNdhzemXI|?l4Mn-X$bwv z4EF2w&q)~WXx2x}_uV*=ca3nmVd#p9{e_uFr!07W(vd%1fuZY0uHUenPzulY8`zVw z;Q4l2Fh5h$zgqA)zl@ySTdnsb>K6Q(jJk*8BzCh|1 zGcQrEr(M#$Y`4su&qHd+X*x0sb9X{~wi39#Y>C}CB-DpRHu}_Rw0>C1jou;dMtHxG z{8_pHl7}6Ina2b4EfbE5orF2eT`J(}@3XYJPvPeBgBN@x!j?b5uJ8)p{n-%q&ok_>8VsM(`hcIyb#oJ;-s4@ar-OsQ%{YTi8`3`~_4bu<5(VDmR>Ci~xRE>S(Ta z=Fzm)L;wd7Vt8ZDsR1>g>-GJ#hbi44WoCh)Y%0UDK)6itT@x!UDbCZK#jL#%Z*)oQ z53fPO{Ghj~roX$s>L>rRA4rKV4Xvk>i6;{%XgbFKLQtZKUCKzEr|eNP88wr1*Hi%x z?)lloh943?qbCfAt23kEL3)4HF^|LIqjw2iqeIDCuIMtmCAYuKy}me=(Ph%Jxtp&| zt-8p6KQx399b1FEn>J~O&t)hfxVJ_#3XS*aSFzmh{5^yjOFrm4+} zBNB!^7qyo{*>k3F8&@O8ldr1U0kv9jk=uuwjLy+xuz`xI?t*l6Y?}W#IiC|(PFYWlP9_q4 z6C|!hL8d%W*0HRj<+$6kJYiui5R_go z-mz#uI_5G@{e*8ESky!%H8M4|lt4}P;ottpl5VYf^^YUH4TZUOXz$uIY3P*SikFhh z3WpCTj&snej?~`_J8h!OMqt4R7aTy^Q?GY$z(SHCJXXLXUxhC={kWFj%jJJRg$v~s z0Ea-IiO@vSa@Ghfcws15`jvChYLqgH)20f&<`ZPtVlf@I52Jz33aWK&QeElxy_Pva z^x(36Yc`wDglSPwn-1ywGRaLf1Yl8DXrsV_J8Y2l^=%Bn7ru&L`;i*Ae0Zi46&I5+ z?P*2cTi5``CJftc*szjuQFOh*YjMh(sbxDdZbT8BWCg{WINLo_+8pV4 zxTGB_X>BqYODY~tGY?W0nk(XV;nFckfU@dV2?LL1LYWLqT`|Ho@YqXW#q&D^Cx) z@1U^s{TGZ$IQxWk>n;L(e9agI(WfJwP;y4w;#peN9LfI8>xFLFm$j_hkVje-&6#v) zZFo0cY;<8==r#0$7nCAcmQYxAoTZgXEX)81b=rBJg2Xw@%KZ$8R$w428RoGIPD#^+>ltg%Xhw zlXfk#gy)D72epg-ed`0=;;%RE^EuKsgg`IU|63dt7duq^+o3YhiStKt;V>rkkH!ca zYS0+mRZrTL_B>?nCK~xvC{+(ADF^;s4>r^&1Pudw3SYYQGjyMvH)0yB{^Zzv7Pls4xbKgnb+E37-PIBDB*>5EOkvi z{j=?i!&JVzwC*gYn9+Or@5xroHy_cTxEjlE-z8`AjvYaz_}M!5fDUrqGo{m6bXm(L|b>*#x81x&Qy@<@oMu;#+p1Ef$YB~mK* zItL5>iq^VrX!j+E5jN#PM;Y;|$oCPVL!b&cxU#lr7B~&F^HYms!>@mj(SzES9~lS+ zk3_~7)0XAJbQnDi(KKqw-_rebukxv_yFO<|bZ8|3D*4~Ow{&{0fwE0=Jf1J*u~;Z* zpI&!+!`XgcMFej@~sJ(x@|VEna19q2NsD z{(1Yj?&?49#K)>1jL2xL_4lys2e>2vqjX+;O<%&iq?WMv!>$|493n+a2E;E?^XjYUWgjD47V{*Sih8oCs_ zH#-R*HG_!y|F^=e_M^lbtaYRxnh7>8|LM>4k|u2q)p3PRzu{;I8iI(M{qC4|_;eG| zWZ4eZG-pQovZdK5@b0RK{w+7FLwvb%m3!gs*bjeJE%x{>6KREu?qszT9=jL%k-6eM zWn0^3!Rn>WAJpZ-W#0%NMu0snLxWFhf}nt#){!#doW(f{QVl)Eg~4aS-E-^OFhdJ( z!G>MKuD-^!Wgpw2CoAl{*m_Q}<;mnwq}Y4<(o!jCq+NfZ?LF@zo=E?Ei|1?Ae_qEg zEH16gag-~LRor2qe}6Gr%Az?y>Q<)QUl1uQN^>G_g{}2_C*666COIecwU>#*RAcz1 zpKgPvOl@z3VCn;!#C6l2j2{emLGy?;@%^OTfH&R0wOT^J{!q1oY@onop{Jp=OUg;smV_o? zEzDB5mNCs7^U6cMq*KVB>X@6ZWLJvff>CDfoL!K(-i`fb^}Wcz4>|V8MKHy~?oQc? zZ#TEKCRW2w}x*GO=h?Jdv0cti}(LdgI zzRN>VYk@w&*lrgDj!FrHBn5h;7d(5}RWQZluqjdgo)za3S$?ORzJ?JH z7tLT9;O1Qscy?PKr*M5@!wK)d<+wf_U0ka$%%E&*nK52|BxzJ<@Qqsx-3@%5cbquHfdWKf}|;i4u-N;2IjrVIa*BC+9#~ zy~GC7P7ske2YMkgDVi(F>q~clW{vHGYwLClTv`h#kgg>vq@B@uJZmH()~Q*ilFK@7 z;f04@sF?GL$Tm7Rnm0N(O2%<#MxGh+CXAD%z#j%8!#sM0$RlA^!+atm0sW#G#V1ck z4M$mfz3h9ky!l*lxc%{5=h;%|po@%%BJfcAoHpVP9ukbu54Y{K38jkWWp zkJWp-h*6(1I-JN8|9K%D5fN&ka^B6$>SuF@#$T>SbnNU#ldmkw<4Qd9l5O@*=ltIA zW|3tXh^DIC-rzD)$^;Y}ST0)wyIG8CRuzl@DwC~Sq&lr!dCB$H%dAvsql>!fA+04V z(~PXyozBN<<4uXtNR2fm(N0@<<(A&SHx`UW@_@eRH zT>@Mc)28+5)K+R3S=6uUKMI9(%*YX==?<&0{H$evF)}hRz`WcMOEYcUI`Ss3S9|0B zaRLCu61&)C`NIO~acBr{mPO~{^V*y!8m=9}X{cTI3Ip0-1{TTlBG4s+?z%aBFb#Ape5}BaV471$3USFjcB?OF(6N}bve(Rn*w>d8dT$TRAc@YrF6kY0~1>SV3z`Lu|*m4 zhriH+jS5`7hlhVbeyWMt&mSaRQdKRT&6Q<~4)(xyQsx`CsQMlO1LWc%(1Jqc49#bXin~obN zVqm$ZOg03Nlk(Vw#%SQ?!>cY=*EE*I)k$A<*ZhQ61%z8!9x!f#Lv0>z@D0XEFYA70 zyV&nfDw-jJa%@+k%$ugJ5x*;}mJ;lV;oOJ#1j=XwzBIFP1ew@-0+nsaQh2y!u#4C(%ng##otU^vB?rs6)63d;;&Kcls*jp2)uJf2P+fE{s}G zXm+LS7u)x=>!}Y$hK(b}4FrgB(PHB5!kNIr?z`GwEUZVRFjf(xtQm@uz8yj?@VPwp zMH`gh2ZsGIKDwO%iWvvI?rxObJFLs!?{-yK!&J9(mG)024f?X7cNXcny6Poo*_w=6 z3Gx&Rqr6E?aA?r(Om9Z6u6}Jfh1CLVZ_lv3hQ7LRyZXecz9I+$Yb20a8XDTx{_VV15_nPUa-urFrm&u8cf zem+}=39tInwhripTZT@XfEsjhD^_FG-$!C@M{BD_qcRv+S!XvEeqPY9>IJPQcG*05n9-%h=&qHRNXHo{+T;Xpel6NCc#8LG zFtipS+mxUEw6mqvpr98z$RUFQVhDy$sYMzkIs0qvX=KF&fl_2f=6{ko3zo0G(0#La z@$saF+TI#*2ZHrygxi))*NVOsY-utI=;Lg!(_0(raXLNztKblLi;;ih*vK|3Lw!Zf zNO!y6sjny9_O#R)2Zia27R7tY1!Ubed=<*;#VAa^wdP~$0rDvp&g>b=$)ZlqfTF5m z90Xq{m{wd7ISY#hDOWaaU~o!uGYih2o#1212o1t;Q_qtfT&b}L&VWO~+Xd5%Y5@de zyukcO5)fe{nWg&Sxc{=UPg>bDG`W!A`*S$EVO5yUgUk8~amBzBOiR8lY5e%NJ#DL5b^PtnxmLqveddkfmI%(I^z6?d_QA zy2*?&2WsypAAkP?uTR}o^F1QVE8E-eNi;ub>)JWq|3JIKIrEAT*q8Ko+bF1!bE_!+ zu4mQn6P6{o|F5G~#C4@wtlWrRPk=vSa#uyAcx9oYx;$=LSS%|T`a~C@L9Zdy_{`h4 zfsF|0NDIn$XyQFQLVPlXD-`n6(4sMkJU(;#4}%#Ix2;q#55ZA_gN$fVL zw&tl8S6Y`uOvb}uM6O5;*M*q1D}+bc(cai{HBp?trKFuR8sQ7EQOXs6@h+*h>K=cDzBo_>nPgpNlCwb{a@3gjkNzZTF2j-_VJVArptQmtW^ zurf7Pw-6MDBK2}1J(V%gu|)6UsUWcth6&6Dy@{Bl$2|Q{8`mqx;JEh?cX=A9nL4rt3P_GQs4a0 znS<2TEd2yKT3cQVPYL61{OvgVH>WqtjmQT6Lb{Nif8}M>P?V7U(g$&H(~|MFmxJ#Q z+_vr8+3CcPYo-Fxu}EWg>Mn>`)0Y?hr2A71NIiDVomz95Oyhvh!f9%(uB?i->rc02 zlZ{Z^v89e#E}4o4w#*g=^Ra!c%R?-A83%kHyDEws)6^QR9HrI{#V}-Cs3fDO1p6IZ zn*UsAO0j9{;CYgxea*Tb7zrDaI?tsUSJ!4Un$1O^4MtS`cpde_pT#(z3D2X-TvN83 zj23z3xp8)S7DcgKe=h^hnt7{;e8ddKe-jh(O9@m;7HCBPapU;6_^rt6iO7YgBcB@H z{u6tkL9V5zGKnAgT=W`3<(5<)fhKa0sl37ttFQuBV*wUQ)!>iBIG>$$Svdn$w7ZNv zCEqk)Dzuf|$xj}BEhLlUO(~(E>SK)1iJqxEqn9xs#V^k7+rJUu&B%%WF)!au)%U(# zq7^*pZN*=R|2dI_c3XPSg4T;yydc$}BPdiZ9_bfJ+ty*;K!pC(wyU6qzgB5HXl-}g zWG@%R6#g54Lyo;tW?gzIl2BZ{wY;H;u48Vp>kZe)>+IJ??Lr%gzoK>4wQN2-MPPSd zj;oCr<2sNYE#|=)=QDEcxrPgkv~x}QB++8|R#-lRE`^>)@f27<1c4)IMB?Q=`VDae)#ojA@HkYXz^{fn36U{-R z^pR&PasNA8didyjR?dQaD!Kr98#g!o;MsT)o`vVciGLlYVD2vyB@s3=`(_)B!fpv6 z@VwF{Hd3$TGsXONxc0}@(Y=Y(boe-F+kq!LhU|gPo8ox+pl2?9zfJJAEE|;itpzI< zy7t_y;hi4&)eTH`Mw>&(|HS4Za8I<3Y4X^2#5nmX-p{P*wz21hbRw9WDq#%{X+skf zU3k6M@d}Ty2Y>T?@6JP`B%smKSC3dq$ZP0zQ%Z$oOr*LbA77| z#hpu=dUZSbNQn9w_P5!#x$KVC%vMN5q+>RuF9|o5h3-}m6Yk?c`#(g;E7KLsL zCyj|>=HjrY)0DA5Qj^wEAS)}5;c}^8DrKo^G#-tJg2^+|nV4ZEGWmF99bwo;B(#2} zTfqrq9BH~A+!^-1nsYB2L^iioj3o&D@&X(a5-bTJWMCfVVb$2YnCkGVg}^FG40&02vj1`58`39CQ; zT`6j5cxpJbo@11Yf{3SxLw~XAi&_UYxybr+=TLF9es_tXY38 zgwypM#T;&;#3ozd@;UmJJ=L<|Qd#oK*N>I!4_goa;FkH8HYkCHWKo(Vne3-rjWz}drr}_vM zNRA|K_RTRl;m7>)VYxX;fkwC$FIY9RIW70Oxp=Y4YIk^9n|z>J_kRNV*B3&tcb&$9 zWnFa1c#ww5Jo&<$V5=xxm&9 zzM%V6{+{T|_iOdiO)_SFh156JIs`SF@?{F6mA^4kFa*4&eOHeSoqm^#m$5yLYuwU7 z09&3h&f)SLjY%M_R$|A9lD=2O_usz^NS%4`(W{pxm2S^uQ|%Hb{e7Eoe;&>!No%mL z-)YS)e-!b&u`w{AV_6yT4nm$O|1eT1U@F?i4Ys9ejKxTE1Q}mvbu83W{oqm}08f#E z4pZxZhLP!^1UYNz2OOEubGX)l&^KNqGo6J@i$|Zwr_Qbn)_$myuq?2<`JbmR0X5ZZs)@uxyXtS(OVpt{Ha!}~jHdJV)$?&Kg##8H%5U(q48J?_>^!2p z=pgg8);5vy7gq!;(OM2{1xbZ(uW(+RFD|(mfryrP-9O1z+PP>N?TG1_Tl@IZgT*iKhMC<|2zG`AQ0&C`*~=e*AFJ#*F{5CC@Xg{M8M+-j154hEOM^ka*8+~@Ln8_lW_mXwRTa*&_cmq!>Qz&>#Ac&af<9bK8IUN~hpF^uqyh{N}{M!6@ z@;gyu*DyanP41EOU(HFuwF0iym$YOjZQ!KHTM8(ULC21TI8d=#q)2A)gEdf!B3Yqt z-=4RCN-Ggi%S9j5bwi~k+cyRt*VrBY8`V)_OWnhJg0Fzh=U!IJp!~U)9}Ks~*CWDI zicL%7>sH%6v9!q`(P)sFj4W&~#a!usyR++6@O*8px$}iBIZMtR)j;0V@sy?JC)jg+pk0p6MrrjU z+Cs}-{+Um-{B%A=s@)|JDmBiRxnM&>^VbI@DPrdb^^a?|3dS!8Np7{m7Vt4mdu}8b zTxo)f;(*ZvjmwCI>LhjZM4NDn61frYjy30RD5eXIh%qE3IBz<^0cs>6{lM>s_;H6L z=-UQoob$~fo#2--$cl#WbMZ~0#;D-Fs0as)rw9c|jlqci_3-bF@So$(C98;xZ|hGK zA3?VT0ABDZC%#hUz;GXFW*{)P71t0p88;8Qu}RFOPO>69o`}fAVjkg+&Zo7gofHLn z-$(vZ9z)I4HAk*-)$n{ON9Itv^@=hu!jwwee)ibtUaRn%EH%@2$JqyM0?g5`5x4QR z$Z|z|Lfp=qn0$;3sCN@qU^)8JaF4B4iS(I{y%ewhF1YMV$RGNGEs!cEd6Vb= zFTlG*YO@k>Et93UyZakc05@9cjwfIF-=%WTCSu~B14xjwwqnY zE}iXW)?F7LyM(>Ov^l6^zP2`T7CzWd*C>WAUaZq4qPBkjF!2=2gh1#1m*`TQ#I;E*XwkSnzMGB;uBNptF^tzP}k3_`)y z|K{)uY&}`dDcGhWZ(hR93D2!T|AA$Z54ABxk{79ce~Jh9E?VRacZ_p-asN{tNKm^K zMXHe2CC`3&-0LdyZ2hMzlY$O_5WKzpw!8%ox8&bk;@zUzFk^SNaF4H~b8tCemN`vE z;}Ith&zzElfw(t#So% z)RIv4SlD2PF3=`XCv~in-y#kU^7X;Z_UkO83JB;4nCJ8PX+>JDgt)G%!QAsHI75v3nUYteA9JpztOtKq!a| zD@nsq3_?+~sy1XmaA5U*+PmfuFXlB-tXg#h)NmLN+J2>%SJs%_*yn3*w=QD}huoD6 z@pmTaMlW4`w_2LM3+>WIljxX-OCv{Mj29?_0qOq89?iR*KPDXanMBH#0Orkt4FV zj7slfSf1vBF_BeFSd>)gl1*FRYc6LV)t*+2Y3)8@@AS2JEB@?Yt#y=sY%aVvnMj7y z^))g-UJq8#tW>g_emrE^4>cW{B)$edfBx)bOh!3Q`7E=*_-mkVARUX;j^2EV>ZuJg?{1r8LAk<~T zaC7ZEVYr;>B9}Yk);V4gLoe+xtRBP>RoSpmtu7+p^}vq@1hu#ezau<%XUTAZj-nk@jHLMWC6I08)&J&I>Q?qlkYI84SyQcpw~T+Y|;- z!OK&dZz9d35C3i-VL(OFs2V>USZvpE^{1Izr!lPAAB?b2fyk9qMV3(%jsrR~n074C z0YWhGd@+tQHp6)yPanu$#+uDGua9-^*K#E((Zi-tw=?@EhLjX0=;u9E>BlqW;A3~xaEQVGjN~Z_CsT~P>ltbgwYJ$c7#xITkwIgQw)UK6OM_T&Nw8+_4M2!OqvZjA7PyZ)lUXYe z3-X|}-@64u>J;wW6F(ZO2~g``!TL(T8Gv5J{RAB^4)C!Opzy(h_a}21Rs49d?7jNwE4TNp5}+@F@#9bCvZg!YoUhawdSv^P!T9p;TV*avof4<}0@p6_ zSuh*sR+1JFw7I{Dvm9+!nAu({X1DyYcEnc7s4v($C3cZ6UDX(rcCpx@kjoVSJ-UVYh=jgq2wepcXCj#3 zeIK15GBe0C}Eh(Uiy6>x7vdc zIx7P;bQ2dKEgR?Fvwe;kCv{2|1L$}@J5O%4o-~@`G+${EGF^5<7 zJy&{?)Ae7g^r~c~uw2R}g1(ik?PpqR!+OXhyVbpzAZpzpxO1bGPN|K9JZ_%#*qXUb zK*fkaDrLfFP@#^xMYVdd8Nfr^OMGijiJw|LQkKJo72r4t&+oeEP9k^+CcSSXpPdhL1MzSz-rpEeRqM+~QmJ-Y~@r0^ZVdpw@ ziht{dU7G3noePbuYFu{*<+f^2|nU#psJEYeBm?U6%-;-~$3jH^1Z%s_6EwE=vJcs@aacl+wnuso#W)c!9gAR47)`CSqf$YjEiv zfoX>G6EO;7vOs~Cs}-~jC1=SsxNwg^b{6@`+Y7NI)gT@(@qtR-{!@r@ zlkUD=a)hc=U4uLx%hzh^ON`X?t8@meUK1rrYS%3Gvd>wF#cP2e+TGOhFO{Pg%EEsy z#-+XR_MSvZc5eP4|I6~MG^0u`35h&m;@svSXNteu`;n&v!Gp**Z-!SNF>Rs7Dt^Te zxCyKLO>I|H&?KGUhQi(!fCu#X5-81-x|8e`7DdQ(T%m76K!^%Ep=8Ndfx<@A+*lzh z_(8vrQN$p#V3-12>;k5mTxBO2OH*Wvx1ef^T$w1vY&TBHiCe z#jk@F7#92gAZFi2m+lRws9ZLyU%&a?6BiXM?gyIBWSHgf5Xi5G@gng>g5@)KD5Y0z zT#-iNzAJ2PY*OLEdLs(MTD4O}rqdX0ual8M50P5AB5IVWrn{EzH3zP`L$y0NoH`9n zhtnTNH@<#t?x#P!mjVx5KyGbU_}%>oZAgrlIwF=G<$kz-nq&|frbLNpc#ph%r|1K41DjGZ2Ye35 zfC>X&kY~|+^BJ_!0vqSRg7#?qO+EABYY$`}FQcj#=iqC5JOAGuHsN;z?3H@Qe^M}) zgvtv~0C+#X)cKviHNCuFRZEOr$|5~V3jb)cOb_ZS^^<>V>YtR_Ik9QQ4wuTLYF$ur zib`*5ug%RTTXVq<>MZHEHmeXg5-s%u%oHZ~uoNu@c%+OW#P(@^34YAb%Fu>D9*Pk# z^}}Ql(wTD*(8aA#5Q1P*6(8B6IPr!J%P`!6wkddNSfQ2cJSfQ&GF_K}%Te^H3bhk_ zL%z5g3EUeWo!#56h}*W#Dx;`Bx+t_BI-?zJ*%t8oeH|+pWY;~QnW5$&eREie7T&2( zRzF2MdAok<9wwKmq2uW`-|u0XOWb`jq}BHin6C1k`T#OEKY2kW5EDXpQq0Q+=w)6o zFd0Xf5=J(BMTf_jx-IBk0PEumwkeE)f@?#3B&iWT+rMP`wU2yV4R-4gjFo`TSenT^vf?6EjJ-xKm^3Hy z=%wHpL4;IF^s0HBa$A_?380LclP*07sn$FDj*Cl8y@S8`VyD38*5&I|M?HPa6i7{| znHMRt`7V1yCK<0{wf$<9hN-*j&mC!+nov_N(l~W@ZMZAVO}ckoXeod+hEtD2z{kek zPYxHjk{sCX`o7XGKh$m8O^et7@jnHCsO+fiXr@-%KY#Pr! z$uXO@0y*9oX`t=!l(fT>mgEIXkN)0x%j_1sn0XL8V)hK0xUur!ECvjEgpv5N_i1)kwlb&Mh+%a|pki7k|* zBH}4%^vOeta{b>r%*AXK>@L213!32b)oT2A`*I-}S~b4Thm$MtOhj#L`ti`Dkys(n zpBO7f14*j|KHn@)Rh?vFeLFj$$mJBMz=@?~eDQ~#aK;U9(rWft;IEyaQ_d8|{ZJRa z8_#Xv2pX0qM1H@D(t}?OZWzD&rKg)-IU&6ru(;t=iq=ZXFC`;ym%Gkl$Sx2*m&v!| zvYbJJSxO>i_fMcsFcFd6pT~(n^wVtxccUW_Ad2 z$QjNLz6LHju#N8E-IxybFrt*4MM1P&h=%hhh3IN__5s z`fq2amvUHe9<~0OOAVFWJn@#U00Y}*&YHiM;BYimGo4Ig)3zOZ2)yG@yI3w)EatP@ z@x|S2p?DtRrudk_C{HG5zj#j@M2I2po<|eZ%$zLA5z!FjdC;424Q$O zGuV@B(dmgA+W+yIpS$$1cL{#%!xvHc70vI+5!n3lvg1p@3XRxKt zsGB@G`d>2_t%u^{GI1$y!^uv%0TeEou zkl=;XrLPhoAYe1dX)GW0xlMw}aJn5akkuZBOVEP52?{^B@I`)n&&dd!jd=)5HC1sY zeC`r<{m$n>Wa`D6T={pW#B))`XY$vF?uD~E)oo~+f|dc>$~O+zF-}5o0NDgveOMR# zXyncpd;ciS8=JSa_2K1AHl;boa88t+p7ZfO7=2dcZY-EJ+rzS5`?;}GG_hLo^$6QK z4I$-r-?eS#C}*=q_|&)acPra%xi_e6kGBke1wWhM^)G#l1O8~K!7HoFOI`x$(bq(jb14M7U_P%p54rLDvjQ zgzxvQ#1WL>s&HxkQO^kj-WHrRoHNs@qW4cy_<$(_)X%8}p&78Rv?CAUftV&NT?-U^ zh}tbT3LxFeMjECUFBmeQqIO%k&c_u zGRPg6BfCL{V~pC;g!e4Z#8tO;TlJ za7zON>ewrj+`$A37!U!dHj4B1c+g$-m_!ZURH%oA}()OFtP;b1T=ej7Us0DX~8>*4A+8Bn|h8x^P93>Yu=BJNpv ztUdz!6rFWBkh=5`LQWV+TQGEVUfw&_>LUoqJDE4^T;&)XHG2WA@*YXngZ3Fpy3P>R z)$=#ypcCDt*Ix>NYd~`6%LLpV`LRSlUv__|ocaHSY<~c>b3u(qH!N}fT($ElbPfTh zeCNfm^AY#I&u?`+{Kc-#52(Iw{(?9Dza3{yhCjC8YjWuv9KZ41+O5;Gek~YCV32M222)G!fhj*2D>BT8-;CzurW zYc$GmG|fh#W=a&PC>*7r6t-!Lei$W3fEw2Xx2NyL=P9LxoEpuC{4lK+W#L+FJoWFrr~-BaO{8*mHm27c-{` z$LDup6Xm8*WBD(GMFs;7!uT2bE0N$pfsRc4n&gsCVCW4zlJKea&6VXvy6KfJ2PaD_ zmJ6`k*DW z6dO%?Y-}D&YxQ{20OmYVj^vHz+Kyf>ITt2hQtG0~8fn2OsXPd78-N~GnoB{;?NbuB z5Ey7PWnCOlL_0*e(0FeC2t(dzD=_rEj%;bTy$^BPIGr-HwaUAQ9`LR1ggQ70n_1mu zVN|zZDhizUb@q#qi*ZoENr1$0O1Ps(^qtGI`Ez&Rg_6af0RuSgS*Es0c2`Qp@2*_T zue_Z$Y|!gXPM3jFU-s#nAjI277YH*WGndO4$6r*{M2=!BReF{H{g;a;N#54FfbRul zUG8m*DX1#k2u`SB!D2R)rz8;IWWcn&h`w_zCl=l!-D(#&+DF{j32I2mj3{HX@2+G0 zR-Y1Yw^;wU)#||P)2GU!x6LjPW)PcBl{SK{YiF@GdeSP)kg=v>7)6*AUzcQ45@exJ zs{CA2p850yr5}M8C?xd9RO1U72G{egZ ztF--$L$`Wk&7fb?`C+Cp;pn57XL3vd%9uj=Xkb{B0ABwi0>wx`UHG>tF^=IY7u?3b zg`*tngH~zlmPgn!TEj~D_M!0_?dq(O`Df%t8Ft!`^Ea3Wx+l)5D1HvmK5AU>a?d6> z_S-R_S>}?Yl{D_%n{kYuqD8`~!-?xXqd>^dtT?DL&oIGL+NxEX&IwkKD)3y;7x29T}-W4T|fhEqBq*n zKQX03a#l)uuKEyAf?a2lnu5{ECW~o`iS}#8!e9aFP=y7R*eN^IP{19JABXF<9f&s$B^KPQh4a03v77S0!x)UZejKguAH4&M?;0=6{&pa47bOj zc+WeHVFt5353DWv+Q%__Coq`LXK^Ur9ZzEzz!IHv^_43Bu*=Vp3?73=*_+p6$l|K_ zinZ!#2IDSavm@OmWRe@P==>Q*T`1mzPfJW-cBC5@X&=W)vnb)_q!Wtw>eCp88%L-a zb#L(BV!=-?@6WAVuhwDpc<>a(4BlwAnYGxo9lkoNEMsByIPet309MHN>YTH;h{t)a&e6jqP=PFWL}&8bv>@N_q zc!J?`z|^~xi0=$Yaf=%LI`{&w;k5$=(<_ZUyHqTdE1Ad_r`&17mEaCpl-%cR#2w*7pa_1_q>XsA?r$MM+P& z)nRqnX){r!sXZf6J_evMxmp}J%M?^|EUAhVnb6hgp@IM%Qzo?13T9~Y^QHW1m5j}g ztcezc>Vm)90jv!k{5hA_!Xw#}xlE?eXy$CjHdeu>^QZ%#!Kfn^@_E9aEXM>jsyZFJ zE4c9Q5b9`?N16>DLS;QLUPf%g0za;vweUy{zi`Y%TjS6=Y{LehuAB~BMNSC-dN?K) zTo9;Z2WteNOtp=TAFUJ_@$2VeqK}N1AjMNRBVBw7Sg`n;U0jA=9;S!?kuUyn!`s3! z-TR)S$@1yppA~ zuau#@f&9Yh+1V=0DhpU3NSeRdI%>Lz+nwHt?*ummIzvH^S(y#lCand5?P|@`tI**v z4YV}JD~KV{>8B67tz|B~!D4mp!}uA{b2ENJW;P^Dz5c0elD5Bv!)7<~+fWX5U#U{B zSF)XBYh(G_%d4~lP4IQT*!|tJ&_QWOg#aeyDYJdpACC*XgP1@PaTc4#4lVoi-pifE zC)1`U2o9#_KJ-)NMmWy<>&N%egb_`STTr7p_MqvhFnB+kq&Yy<$=Rr@8mFm3Y?Y?1 zQ{?Y^1Sp-B8LbKrXtyn^P%lVzmHc*N_wG2gFuTRP>H6%`)}#i<}x>xYJhvqb@9!1PJZ;_@Za%ttht%vG>cey z=a&sW6?#Qmk8UMEfNS&91W^SCMgtHUh<*om0mY~1MH8OdyA8p^y%Bk&R|oSJ zab#KH5s5{d#gq=|9cc!*(?E13F+NGS2L|R%kfoIg$JP7r6({j(hOkt{RAivWbR}N7 zTC2FCCkxA@F0wlb%IQtZxKD*wM97#kyJls>;mitoyy;KOEa5vJl}C7>Sr<432O9~L zKXD%$E`np#I4rBNfVSaSLJ;iZ(FYRcZo;%52M4UdYV5@tyeer;)_jz_*35GWGJSql zlPxV#X@zr}>h)T!N?CC|oXAz5n2g1xp(qGXUihHVH$Ol3WYfdkzmKg;tQ-L7QSu)4 zk!-7PU=;?_^cXd$TB5${@NS@^U%b2JS9u!9Sglun z3=SU@A@uCF7DHWQEFAa;khPQp#`XY}yX7FsNuPV)Tg4GalEqsr;$GshEdh;nH=GI6 zfi0(hM0?{wf$=`}GQ!j?!Bu^cMFv5w&^bajc3x395rk8cn*|ID zB2`%7;#(N#v6oBrmu1)P^7Q9R`uM(eZ)<`cie@)R+D3Hfa8dSibJ=2*(e5I-wuC^m zwtNVh*A2Vi)Eg-@*gi|Fz5?ZK+TZuueT3=CORAcPby`!z?V)IPgDYtRUw!fC*GFpK zp&C;n>cE0h5fni->M@KUut_@nk~|SK8kI^7D2$#jDYb7|Av2Xq84W@yF%PxDg=dSG z+o)7cpSPgeFLN3DRy-a|@yq6CRMhOA8G5anr#mzI86K>QR@+uwS!~!!Y(%t*{V6Uh zif5fx@bX=a)U?s)t-##ps`8rS@t4Eq$4fhEwMM<3&9tl4q~MBBY}%p^MK=yUD{i~W z$`5QTK6(>ZNNCD9uUu}Uj>regXdT#eDsC{|sITiHOeU$KxHrLm!nlT%u_a)4}O&0A`>(K96^ZtIh#0wqwgNqvB?8ngDeVA2QYvz8)l{ z=aIl;|6{|AC;%X^GGDHJy$~{Mu%72)Dsb)i22!9EC(i37%yW~le=DH?*>h{2J z!&v=Gcl$sRtlCNk&NdpYhj9%{@?AL%Uitmk-k63@L9^9b+~i;>;<3#0wl-?T1}dUKA8Y6zdkT2hJa=c(z=obrlBV z0D@?svnN{y+ombfbYDR-j=Gg#N()c1rN=8F7?IxyKrZuD=|1k(AhnNVM^)k(7n>|2Y)&WRJ7DUDNCg{ z3F`+A!pk|Oacg>)8OBkZP}thL?o8zm27}nNslZM&^I3#o>yDWQd0#W`oTbCa_X5|C zNs;8ws?Ik#?&ANn@{bc_Cd-kJW-M&`7fV#eGa9k&crNOPmMInCNN1SxTI?X$F%doI zBbOy8=2%{kJ{68(Ns$Tok6Jde%K!sL#Q@HM@MyRN8ANzE!VwloGsr*@SBecZ#mnLN z7`CWCH^G`o3)RSew@8gf=_RpyHO1=nD?8AT9H$qP0f^Qs^+`YIk?6ge$dYD^)9Zql zD7sez!T7vR)1aBxx;VbRa2l_d*W&b=nK*W@F9(wPxa0J$Y|Hq)n#i)YkMQWd27shq z!*Nk{1atq)yB?e{1tE^PWi5g5=)H#f(RvNYLJnj4^mJgitT~EM5BojJLKz^~`W?@+ zVdAv@aIm6rRj%${ZpIy+uW*H5Rn*r%YT0pZL(~V#FPEGL_e(!FskA5}1fdFz&AHSrS0WmIK zUbDQpUmSUgJKiQFipZ0AINUEr#>dOLnUeX_Rj*4zz?6q&?8EzO>`(NrKvMIc4wf|$2s-7!*`q7^2PRL@-*vLh>YL~!e^WiXMiWh zIaT~7#ftdg9s9!t3WfiWoWtC4J9x+P(7pp%X;Us2A5O(a>d>Dou{zDxAUSm5h#P#O za5#el=18Yj#%LN7pD>KFA!|UNX0yr4=)#ea9qJEc?&TuU*5nn)M zvsrOPrb3a#S(r%7Ggv{0iR(C_g2`snaag8QgbdFn3QjD3!|BrBYjAAShG68Ov1mNRk*bmQ}zR%iNPpZPy0@4OXUj z!g%yFJ5P{3^s9V2W~t2hxXfV%xdn;$m64#MF;pg#E`#g{xy&J*8-FhVKS030zPx{q z`jocZZBvCccc;ZIl{q>tZp2dYn!FEdNmr%2_lN%U7nd2M<1&P7;6MhLZ(2Z6k8KL{ za~bwM(@`3Dy9__-bXvoKyff}-_|VNUaGZj)^M*dcr87kxJ$QTYOIOXu`0xauFPE#y zD(vS*LcK7^sK0{(m1$5sn!%Nm62__R%9E|9K($FL(S(1(!hbG|#|Zg7+<6>&Lrx|MC{Mi}1&ySP5z{b+)j2$Ph6hA`4vDIp~`bD*=tLU&Q z2lE(a5XAf_p|@DPcGH0&P>0F;qyTxFP}{Oy!I7C_E%8*$;8nO0H(u7|^JYEVnduDh zpo}L2Ze8|3zc}mQ-Ua%}Sx#;TWp1x59!J~Ya3<{Cr{My zNn3{?ex)99uK=Z1Pn=zGp>Mpa=jiEVNM&8O#|7siDn|umQp%4xU9s*16RBAobAfZ; z1^5;rAinaXP|4@Bm9jiyc0ejbLNdjeO$8B?p}?rVVzFFSyvmUCS*O2|D&v53)@l`s zhqY}V$(a)1>DZ6w<7V6}-G7}gg4Sh6S!Hbagk!PUG?~i<8;$<_FUTWFKU*25^=GWo zee;BglBHNJ#8>tr4nAH78NTTC@Kn-;L;KSD5q7$-05}ZN$^7}Gg5fI1=kmgN{qV0_ z1o9w~=%BV7D`dRGCsYN>l)2n+p2z(QWs^MkXiFlf^rxo3I*bY{gY+J;2|{)M{9g6f zCrHZ>cpDd4{=mUSPP@xFK}dkLIG(eO-Uv#so-^F3)oZmppil&hUw->_XvYSx&xdra z@%rV(-5W#jOpas9I|+b63II7WB_r6wR-vb&+}(OPp&z%Sy0&da{Wu1!aQXwU$${{! z2|Pr}av1+I+3j9Z<;Ap_gYcbKXT3wLKa%*s4ne4tHvOfy$qvtCveF&K0h3CVkN|wF#_}C?%F^hs$2_pp zAI>$KnQ*#{15L|Tubr7}=fe(^*w5)d;GI*(LqZ5=BWq0r9W)VDeV*YtzT_Y@N!&OgY8AJqd(gQxXUwhBQc=LDN-GA`G)ANOz;kFw!+}BuPb03 zM(jyFW*((JpPz&b)s^L&dS{Ah7s=%RNb_gU_QGc7N%F5N)l|2xYe~kRO1|MJB#_af zb7)tUG)->wS%sE4Qz@k6;k#iwt;uQQ*C}_-DmLk={lOHGXfa9~S7Z&V5=M$7>+!KQ zd|!U>VBx>!nyKx{pV|X)G{ExT0e)@y%1Bz~uL^4g#%j6*PrwlLltd{MK=^q?Y0}_&Un|4l;KKbhP8@rHgKJ5Ou`Xj-g=vGH=N3T2`*!7*<+;?$&D@ z2LkFApGg;V9h2TDo~N37qG0xvWGG@e&Z!%U2+oPP(bqv&eR!zTc^5`n{Z<2uMp$=( z^RN&Xmse-`w;Hd%)3!kG7c)L4;VeYIg&&so+k%P&*woAvZ*XqJAMs+f@0 zMwsFP#IyapI#Mtzj80V0i#1zpRYbp7iMLRNU1ib)+aVDIp#!<6x%UQ^c5Eu+B8`Ty zHi`0-G>gd2eBIPeXuB88vbxoC7 ztPa>#HaSuRZ4wkCnhn!zm$RMGAw_ve72BT7iUykgl%=8zF!#1b+sRdBO9pktOYeyF zrcn?wdI0*H57xRAM(;2E?{`NFrWC}$8lj6jQzM~6i&(W-BNeMxc8!q^m&#|MLAqRS z8hKe%@2=6AsJTD8EdA)wYQ(wAo$SByT|pe6^%MyR*yv9tQY?fgCSo*S>gXcnDzZn< z;I-U#nvbU*?N_V2o9)`|kbN{=uMc$gjUe?|M+SA%@$CWb`A~YQs)XJmCn%u+J~vEPbp`>HGrepJ!jmZQZ^h|*ydPqqV5r@mA#t4iz-gG?|5 z-LdlhMl?5JFZ8zRUhmr5E`7Rmx#;OK9V<9=wJsskV*y%8n0e6mTn(M~nlmDuarLft zTA9HGp;>|-rK5AHPq3jp{RIMTYU!j?BTJ&pCSN*Wb^K4 z*BwrbJ^0{obKfn9)fcxPY?XQgrp`2|TX@%5XuUfRtBSXiccEexz~Sg`?-g0qRKV>( z^N_jp?uo}ILhKcio^Kaos+zd`hgf~^Z}}GdUn@RjoPycEOEgu-u=5U}Qr3AxLC&4e|@+?*lk`hZRyxCm&$_T)e6P-*++Cb0lN@g<6 zV`;!AAt40ApF7T!(f5i`MFx>$nSm=E!6?C>2C#elu54!RNfDRSB!o}1>m@hr&iu(U zAai;S81)&Or^ZEAGvYf)eOVbvGBe4gjYxD;dQP9@9X5Tr`sXG8hjR9Rm)-b&zSz2T zokSm8(rNgz2HF(@?+wJ>998L)<2a-bkvE&hCYHz~_&1W~H=TZ3nrH*BUxsGFf^sv7 zVc_Bk3B7k4Sm<2Q->>JE3ap(_d7`ipIuYOI$Tg)*F?V|~9$$L00o7!sTGO(;LO6it zqlY4Ek_aoSTZ(SQVR!(5-6wddwmmSRCj!(F0X5z`#LQB(LRr=kaH-;6{15a#J{!g*wBd=s@`Rns&A1 zg31O@M4z8Ke}Jy|`u1WCAEoOb1X#AWk&`a1R;mxn>h*N!TK*5E8;Jq(j+aIA z(ZGP~L%x`dCeno%nwwgp@d%AZwaByT*kHa#2kfD=WU9kiN8$iPYXgB7N1(`ByRNI_ zMoIH7);;O|7R_yZFMZo=v}o3FsPt){@w^b&RB-D>37HI9i`x&5PdXsaqZ7w5X#>Kz zk1z@o(G?K$f|zvrcG3ZrQA|Ux6LTQUk8`YG9@&t%(HWxxAc*CRL`a~tIYdK3M!NTe zWeRPgcp-}A1d(MWiKDMD0K17G4gy99f^i)pQA7m=aN#-ub!Nh?)-=3sTJ6o!5didf zSBfvpAC6C|I?uCQ9)39q!IpMH0&3eSlo|#`UI#pi(PRhx-!??Mu81^vSIhnQ!Xn-SD@UnWoja!EbaOKXSnKAS ziqH%XcEi3$dxve33TIq!blZ8QfX17uE!R^I{%#dSgdm1 zz58%t+5iM~S_vX^R%OX|oAc41+MTCWVJV7i60O1t499a-5@e;nC`z)xGdC~*#H-A4 zF=c(fKyeuDb`;HG0aOKmizh>Ggt|A(wbCx_j9CImjgh1NJ*zj_Cpj7;%@B}cnQS`eQ)J4+6<(Qob{KDrx2x z6C`>t=eMgL?s@RxJN3Xr2KU)0r}Molu_FYp$38yy(zbGCu$7LS7=di-V_E7Q;cwWX z#7$NBTo@D$cD>Asvk{2Iv{2|99MftRCW(ptJI7)`fE{dCFj|r3ZdO*<+rjP1WJv-$SreY8UKZk&NBI@J> zSym#dx_e9_&+$CVQY1|?3{BNXCl>9WBkeO@*gw}*Q>qv11>fo&np%Po=uKK!IXEx- zsZLCREk146e)AuK6{`MD1Fu}uW-SZu%FUpzN0}1s^#WLMe$If;DCuuN$lAJ zcAG>SeJf}@;i1+Lg0VY-;wWKinms@d+87C^T2d~llJ=Q%qv)-%st!Z0xz4Iy$FksW zCGoo+cN2w+AF)mw=lD}5XS+3KdwsSQV(9S~cJzF^38hU7<8|5Fo9?t%RF|RW9pqZ+ zbcm1;L2s{Dx1k%(RSQ62a^-a;S1;mYw@!eDX54BthtS&NCFbg}YujL6^Rj)s?AAF! zc`7Qas%m1OLz}28YA5AF>!4EyFM+q^0H-b^-N!QRy|@AEcVQ8vGI;LKyC-C zv6c9j)^=cp@8|gG_t`#9(6tfxKZW4hi(~oH^rqf@?&9FI8xa&(dHSgH0?GFjhbrQP z`Pd5o=RZn76W_1gd+q$?L@l~pjt@1+pnnJ64n(rdap!^l1f|!uC`M#LD11+K0N1sK z9M0>wd-;>$_r8~7=~=QooBo{%{%LEqc%ZAII<7_AdbY<~dZwGF*+LI3iUG&B(|oMmGpSxIMA4H+-iKe0B)XPVYUUy)<&o*%C<%V13}~c&>cVTE>o51L~!|fdD(C@pw~4t)>DoXL71fJ z^W$ngOCF8n+S|c}8W=2XAi6F%T)(Lh%@OBt7iHecV<%L?BRn>WFloxE_=21_qt&4d zE(DN6t@gRShf+`@=}pBNT|@aEF%Tir)?g#!+yfhw8)Zc(ny>f~z}NMsqJG#5zsZp( z+cnG=5IU-9O|x+b=3K$Gnc7Hi8+)%&b9-iE6uoIpv(Eo0`v*xZrd6wC?>$E&+4 zwjD<|zt~l0+}iRzLtURi%1H-7ae|Y`4$O0^ph?IE`6@r{)Fbx?*%mL1*q!?lzIe1S ze9^HAz}d%DCJ>41duwZpXTKVI{Gf_cg4{I9@^0p=ibn1=+YJ3wBvbKwUu%* z;|%dBACpbMPKR7%H7$Y{A2zL@V%36)H9~z*JxMXKQfnndY`x-K2LVk8cB?eSgkiie z{{D>WxyrVUq*ZLYMa0n|@q!x5S+n&Lj@@savcgV0QzHN^LZ>sJ1_^>80VuBr>3Mb< zn#hKsewE8Dn)PDo zhPu*}EhpN`S5nQq$!zE}BA*|LH|0UK8a+r&lOtcfqS&Z>bE$xSWKq4`PG$a7{|3tV zs{Ys}_IJ>{D-j-TPiA%ttF;ml1)l^udfPFFS_sj+X$s(tiX@QKu@=tQ+u_{U#_lGUDY*}_$ibk`Qj8P#HFtHPUWv9I)~2zt?HXOSlqjRJ zvYL}d9G#;9E(w%_o3h}z$muqbrx$(GcxMg3w(Q!mh@)T%eL8HlD#qN#wpt>k722rh zmjssyMWaokB0Uo3$JbJkqi!3pi!j9v4T@2L4j9|tAUeSai6SE@TL|N!HV9)GC3s=}~Rpb1lxnw*3BRA{rt!q?>McL|h7eI8@tHk%5AN98C=)0N<{Q##820ml}l6KJ=&vj`|gl48Aa)r&sd2GTAuot&T@hG20I54h3A7+XkdQ z4z(zCq-`6-$g(vn#n4EA2Q+;D^>Myb>XLC-*jCzZ;1&&nEr%DW55VHlQw^+Gbs}P> zOjaAMQI37}Rxm;G+f-Qah&OXB~>Q~yE7ZB@QSv>swU z^Q@r8kt(d_4KxEH5^iQVg zDP~48;pa=;tGkIsVA5^$_v%m@iFCnj^#B0V&D_-#0b&&O;$B-GFBtlI>fgTf6>-uIx90-@kQKM@ zo$dSP@G^bT7ij+fb1Q=R;Rav3&%||>9$2`4!}k5kGmQoLMAZn6=GV$8#+UlILmmha zO)g*1NE71&HyV|=LF4OME@ckxum=FjmllnuKQDKIX?_SGqY0)Y-(ScB{6831^Uc2k z!9=J8Q^nbZExpWicQJ!j0kAnV9`#6QLXZ~DCh@~TFDpqV3xCT`v>@@{Wl}!4!wBv( zQG!mk3(D|!%l@f@cmCTw9;i5Wcm75B!13@K2j3LuJrhPSUn@&1<@Nto_Ivg}fpuIc z$u7i?U`0&;gp5>ilszRnIi@hQANP-@(J)OPsBD8$f2u4Ku4ATsNJ@_+$5ghjpY}(7 zZ-{iY2!=^JTdGENA}-8KE=Sl?RHh-!u3fs4!U%l6&ebAfavOHY$JsNbN|@h2m9o!! zl^jz^!<+ge3ArUuph>#3rE0(@0=i85Da(?O98;$9RM8_FsvFP1D(TMFRn#M5w$%86 zsN2?%R8u^pi76wCwukX%oI)VTW>5bwZtSOIan3aSm5H?r>O4Wuz)AO5qr=Cul!V z@!&0=PpG%=YqQ!%qYUn(O+USTpUwXWG0N<3(yctE>Z+iIk9qbg0Hg9FndrQcK)tMwq&1_H1M z;2IcJPIn>YD3Ge0@?_Btg&+r&LQrXSzH^S9#xRV-AZkf;9$?&@*sJqHhR)5$x*s;Xxb4P%e+^>eb&A6>CciykU}u7YlB|I9Hbs!=Qx{~Q@%QRIpf zk&ps~97ZBWcH7MJ_}s2?xd*thg;CF=@Zwk(IzlN?>9nU2536k5%qBL^IamI#k~9a_ zZ{=GbN5zdB_#36I!9{{-FnM*iDWk~;iNC7-|0qNxX+xSdQ#M7J^_&mqAn7g+1B&5u z231$oa^@1{%sdO9hF~}{GzKng+j`D`$9gn)6s_kxOl=GF{WP4lwkP*6N{}=@cQexI zIm5_fJszxZezM(oUpy~D zjMT@OPFxv{q}CNiy4WRHz<6#pUlf5g2_eKFA1GRpK;fjJ4+|U^c2LQFPvLqq=U9Pb z(J*}rWuO;%_FK*oM<6t@9MQM&c^g(H+#X)W<{od0{?Vx+K0gThCX$Q>wRYMWD=~p{e1o0q4He7=b>8}gp7gJIAw+LJ#I54IF z|Hk!2O(5mCPGIv9bj5npYFYoasJZP4|0eE5|AG|Pw?hBb;AcVj*T)Kg$(X-r5NgM1 zwi#y0yw(2(@7gLRWAmbs=?Bi zsUYQ!Hkpl&f~$4!!Q>k9(rgyD?!8}OVob&}U;Y+b3bB{NO5rVe;t-P0!xaq4H1@Ie zT0Ht{^K&70#+v(tHBlxoDLmy(8f}bxPD9|(x;on8^b=?4od&M&i7I7B2SLiBOkj=0 zf3ypvENl|2slql$ol^BIGcD)_p;KPgy93Qn{d!MryeDCLbC$wbYhuAiFG0!!W#*@e z{w#%*5&Ez&0Y?!Z=D?(zr759M-HQ9GS|5!%6P23DuK=cP)EP%;mPE8K3?jhUCSE7r8!SFbcMd?{eCyFU_!CN=5pj;p@UTqwv#|6VzRW2`naTD_W- z?>mHxnu-d=nhPG3^cqQKP$0v5+2sDv3`dFF5%z#R)`i!+K_a&9w6~9czW9KZkd~5? zjN|n|GVSUhd&H~pz92N)+<^IhFb$5g|J0zoi5eAe8Rp#CQzjCll z73~T=n+xH>ox;-x6SQ`smN#a{WnMB2!O+Se4)h`kgMEztKcONT=jaJhDV>g=J_vT4 ztW;t0qA9<22tTF64j-Y^L~dMb4aAOl^M`6G__95cNTgdN_y)Bz?n*XH`v;ccu*0x@ zC(}vrW@6e%OxJ}}Y}6tScyDuzrG|YYK1Na?kr-rYPJtHizQQfpyco8BHAQtjPgLih zb8%b0?{+k91`Ogs{h?IEj^f2Q?QMn;jt`6$i%Y3Dnhc!9tWi-)1&Si_G#)}=Eaoak z%41_IEwNW1um)vH%j=hZllkmPTMsE{qYw5uss$7z)iiE|XjB2r&vS;KheKw{asz|X zpwgT47Q4}8HJgKT9D$I-6$=E7A|abaqYSxR4vWQPm_i~P(e}1Fwz&BE&qTedph|Cf zwBz8nb`8LKnDn}_mF`5_-}HF>>>46ltlnq3GzNd^)+FB>L-v$wU>f21#%~ zSn23>v;hHcnlo^9zSbOHuAUr`025>RTCzoxo>bGN_n}N*21)lq^E{t-T(}r03ZDRY# zsiP`inxYR%rL5pbJ5*eR-1E|Ul^8gKR;`qs(#PzzLKi}fg|6c%5G9zhw2c!Ag%;Sw zT)vhWZcV~Mq}(YmhcaqP3TmU+Vg{S7@u@-GwDz=e4(lk8;E9HqbmUV2`ePHuF4@e; z&Gbi+<`4B1_@mun!u><1zX#6$j~RzgZ+!)HaBycfCOqDk@1oznVd*SRpJa~(N${;4ICByD=yU< zXK-_BL+O|_7fZw$)ZUYWG2`4CZ)}F1Vp- z-jP@r`BkRxx+hc>otR$9B!|t0?zbRwAzP1W3&gDv`@u@~WNmTr9&qv;{qgq-NvDlF z9LmX97tMJm#}{WyT~?_YWp*k80|~(?;lcgrV?a_M_GPz#5s$&BT0)qLhuwHKpV(x{ z8Q`^{5xfEwW}zM}N*8r>sr4pHqd11)f&tkkItqj`XVw&{yr_NlZg>PFW|9lX-6}~= zzX<~?hTH!tQP_0Xkh2S$Kb~%TDZOvz+@)f`(ncg={q6~PpoQ|=bNoCrX zEl@0zehiMbmHN))Dd=OKNh5uyI-gctUXp+5+In%jLU!KL&eU7)u!J;}7g}>T1 znLdNn*&UC43^TDJ#x+Wb^=yFXe?w=?=W6t60-x@{F#Udfy)B*C1XugQ0vxWjS=4(I z6-haHD%{dLE)=hk!^A2;Snyh?JaE35*ljo2{(spSn&nwrbH%7RT(222=?Q*>Q8Y}G zbfo6zp_IlE(^U`&9bU0a(aDkxx!Dzqa2rmJ6=e>-^S$9+OfQd+wj?Jxbrx%%i!lUqOlHqE}UOn_RQ<&nutr~hnsuSt^(TdfcEcoem&-5zkq zLP<xEHt`I^Vkv^ygMONJ zH-!G7vC0$sX2wvoaj|`LwNl&^&!IniykVh*Wsqx5@i|wvloi+?#d~8du7Glk_S0Hy ziE-;(ZcT(Mpv$DRfp*0Y&&0=o3fUxuINf7R(Rqw`%^VEh24g_TQ9flS=!WA5- zh>%bs`kx2E48Jq@4UIqUN?oep3N zV}W2AN|2tkE)pLq+rCb_nE%r0YRS1DkdgJH{_|Nodq&myF&g$Vrovl6&z6;qWmgxw z72-c~s@&drWgFX-n-HU}(Ag&rf0PQcv@tR> zk3Kn+ZQuIu8VRZ527HPOr#5Wz`R4QHkU09uBlmPj9Ur+c=h2c%%xLu_o$jdI4=cm@ zg)MW2;eMyvny3e&MisB-Hey&{oQ;<*HQP&>H#B8Vew|`l6LXz#^uRBt9UuJ$s|RFC z83D%Xj1*jfMH@RUkX+}qUH<`&n|8Qp8Ve}FaK4y#RbrTQ*`(l4JJ(=f4h3Jr?b0{>=aE$8!|we9fi zM5E;$l{Yz6@| zW3eI;pd}f5h&G-5;mNY0WgwwJF`2X zV-_UcYsaQu(s455Y8xivu?!dNu>UtG-SAXZa5&mDoz|iYf-;j?2XFtEoxLjDOWA?% zCaE8q_*(A2FOH1;9Y7>g1I(AXtWir?BC*}a9*o11Ec`w6pXYx;Jp*kNvn261AJ2dd zGIBW%K9eb*oBg-|U$;J|WZ7UWm**KoqJh7+^1$UBh+ z{U4Gn>D?gbyai3!h{KF_JuMJ*zJs|6ygIN|f3a?6rl4R_O#i?$C48gV%w{WItFfh3 z`hD#HS0>_<;ljcuufdtC5Mo24R)W0#vIp%m{uy?gJY5QAYIV z3CTp)v7lDQ!TDjw_Ye_`$hOuF?pmYZzyFp7!0|M4jL;$gk6(Y7VYbq-1Z=Eyx)I8n z1~IV!_(oH=`Hk~3Ih2J7Budg730 z_CL_$%yl2J80`e)?l=atS#E>l;u}xJCgI!>r((GMIQA5W_L%;!T-s@r4NlsLgW{=` z;W&TzB<^t#YZjn|@1>opr{y|n8O+4uREFcYmmK{6O zdcTyvsvm}ZkzW3dSLNXG7`7>VPEK$pl+e*eu;U)7w72GiOFTp!HiC_RAwvKWJPx8% zqQ|j4aY>O7P@Jxa@+ZEbr!LnV64Xa&*)(26O+#@VK>5P!XAzBNtQW>m2Edob?(NlE)5wwaZWm?0uGk8%^|H0tBTNrrfEB#CLP`*OAWR^E zkXv)-bjw|S0}@*`1gu z*}Q;+#n!eZ;#s(ix8td3ssY@8Pn=$O?{ZI1`0QT#Sa4%%_?#jJCi+g%^mK9W1I>D2w&T+d8wuwX~2-+N}(JVejx!&C6{lfV0WCv-39^!;jU z7zXHs85`XP|LNf2Aw!15axjsN89Ep!=ox09|1bs%WGb|Y&8LQyACB(0+8G1NZgm5_ zwA7&Iy-3Y5Sx^3^1>j&+UnD?+2tG8N4~>Xl{N%I4gr%-;cFecc+GLFtYPfSOJ!c-m zR~mJJHRt9nxOr|QzP#eiI75G;zV4ajCJ?hlDbim>Q;Uz%7bfw6%gHJq(j0AP%zWNt z7LF;H$y9`hSsGVrgBX@G?q7X~_##*2Q76i>AOM%kov6!D0!Z9S0ExCt z1#6F_#x)73#k0SeS}F(mjgcw1^O0?MEBgr0NBj(rk=*J}LeSwMuAxwv*y6#MTfmg1 z``0cTdjeLzD{fSeLhtLJ)BmehAcvt(mr3GSGwGii0VR9Tz&Gr?kS}3qnrVUp%bjm~ZcDTUAj$8uba4ShfRl$PyBSM2)`Wv=mP)e;inFrLT8rQ45}?A+{Lm41 zxXp+vs$_DOR2AYXnDUpR&=XnOudz>EWA|{nzF0v&+T`LP=wh<*1 zjKE(22!$ZXOprX5+i1d9q}bTtu+oW2PIIfl?_Vt)@*mkGu@bmewqGaPQ4BT#CS-VKjErwbb8Y7&yEJyxMNPS;Sz5TvA%k2 z%qFbd?B#(^btdKM>K6}=;(%3QbN42G22y1z8Q;xNld*0v$WJ{9Q*0);HIsWN$1ZfR zBJbjJ)O%{GS)8-1Z?AU;6W#fkQH%p$fk(%;X}ZB_YqFkqzB3DuRl{=qns;mrU`d47 z$$BwDmw360&L<)p^9t8Oau6FWwatVJWM%mnf=BoT3&hz)yuQWCSrc?En7=8#=y!XiT*T{JlpmGw zP^UTkju8g`hqn(KQC^C|#iKEJ9?rvQawE<^W9i~$q+GUx*`F*7Qj&O-+4bPJh zU|)fL8PmKax2Flf<3C=-6+=j8<50%*i!7_WuPw-0BxVw#2HI!0SiuYr~Ss%M;VDfaLP@}`K-vOclW|7a#u zzS+mpqQAv%*OkZZ(g;L3wr&DSxRm0Bm%r=Qbm5}veqGic+L$9zCjF<8sJdazHSMD) z)2QBDht>pJ1{C~!izCDjo8(x?I~!us*q>r4hh+;c*`++ETZERM7?(GJn8E8Ccv$Rv zk(PPCV-X%E)_tf0wl*65P$#%CbSV0$dK>GYHwM& z*8_oyuCxB3;wV81sagGnPqw1dfMV{wr3ZeMib8({g6**#Gkmpz^g*7pxRw~sF>{Aq`rBbov7mFPsoG1jB z90mj8QIukaJq5s>Z<*wx>_qUWi!i40iO?3A`(@eW4R*7NeW(vTG5kb`hcJYR5AIrO zz3vPZn`V^j%|vkBjuleMqp9#tu|jIwtR(lqo2q5@{^N5t8)2(mxE4m!L^wV;1aNTa zm6HqKrv(~pGI8O;jRGY+XmHS=DYY?xoiRj}0`=KVwG2rEeQLRQ?-!TPV?P{x*4F*i z^d4Q}79HnXK^RA27$ofnQH!yrj6a2d664J0{5+k|16pcGAjy=b7rWf|L%74Xa@3Yt z(hbuz3{ek+uHv;IW=20ndTKtJOeLQxm4e9&_;Hl=#+&NdqUS9>XixB=zR(g-eUc}>_sEC=0InSHa;)m@eg*sW5!!zM=f>7V852osCA>qed)@9 z2{Pty59#($ak)=Rf4W-+HA4lM+d+>w?yA;uhqk~0Kw6U+$MzZ-w;c3zk!>S!m_i2D zE`8XVlN(exF@(pbF_;uX#&IeRJ$QQ8Z|&U(TJu8&(6Kf6$ft@9`r*CH@t}uxo4IJP z)u2&XI2?(3Bn_hSsDLCrS&0v=lvZIt4;dY!2{}12t5)kEUrpN*E@7e#GWJTF!z@yQ zHEj=6Kudr~``Nyh}vPO-?y%2@hm$^6go*9CKise}* zuJzTUh@ys`69O5bk8uT@)7ZjByc3ZWqNdGB99u3|F~PaD&)(o6dmKY~CS;DBA3wrM z%x>g#U+iCo>G^dm@u5)tlTq*l+tQv;jVm-|-;bD(TqE&a1q)2yuP)nA;`S(T(ADB z$n+nh98%1o`Ft+>=VCxR05DD!=s;#GK`>QAoGgoi`p3x~>~D^GQ>|*Ie64C@mFBP2rKkERw5)mayTECy*>ZRo7eQX52V?1w`+ z)9quOC1hiq%|%+VupkIfZJ+rX!fb3**s4Z=G<)Dx(>X*2Ee0#MSM_VHqqzG$^8dZ` zUE6$FX4>$x{MnoMSNN+`W$SMSuh&d7wi(R-<9+NV*N+GPE)w6T1EQqxkFKTup87s; zq=P*LX$v8VD`>E+BEzriJr10QR`B6WEd!ztGn19g1n_52D8UdzhK!6*F1H`~8O5PQ zDS6}@EXIIzV@kcX-kQp!BaJ|UyCH3?IPDQWI5u$sZ2HmQMt1Pu?6Z3z#Weg-!xW6< z6aNB*Xc8^!O0t#$1jAspNtE&QYoAq3SMobuGq98I)v8%pSEip`#m_%U7X5g2=M&vS zhAh3hG!vEtx#VHYuneS(5r}jPP{;=B-qOT|dhTX&rrsF%uBJb;2K1{zw_6Jnd56w& zYm4|P0#~>#%qAg|P!EM|hS>umQP_W5YwZ3q-IaqOtXL}dtvgp9$aawz%wOrTT6wg< zTIMVC3dgBF9Qr>e%s=7AM;=uJ{_s{O0ZPG%tP0)NWmP-S(ae`Mo&>A!*c(!AsbLtY zw%fgfFj#0UjMgIdEN`^F;2A*+j+X|H;bL5T%(Pr%)x_^f(su-H zmt|rrMV+OGQ-IZW9Q!AEgwoiTR=D8tyuxc`I4@^@SrZxRuB)vbxRY91T1n(xUwR|w z``z%rUp6St*S_X&F(A{JthC$DrsVDocSWDG95K7(9Mc^YZ@h*9di zdjHKI4*l1KXOHw#at3TV?GkpXT0OPOite}0uLgs=)yD^`D&eeNQSm_czZ192zQ9rb zzNhOIL5^{1xs`_GctZlJvqFf>=DXET@7Nw@Lc1+->DK&pgqMJ@@^w+J0qVl`s2 zKB^%9k~|I!SZP?FjBnV>u&E9l@_NUOO| zvNr{yna|D2>83c5*v&n@SP)p869uhRtlvK^}BuG*;%kxfVf>>^+qe@&kxLV4T%S~lA<6$4x zoe^fCH;7k{^|NbdePev+7M*?FS;!^67C_rFz@Fsa%m!9Dy1ty9{6R4MNt(*9ciUlQ zZZG3Y^ZIW~5~eB(?7YY^>VBn2sEV+-TRW?joD{+`4xJwGh={3FMrbPozo(s(C#EnQ1W(IE_kd1oL zSm7zq4Re z-GIS2ifzt%z31fBuhs?0#5DIVXG+u>o@`!pTR}llf3`Su_(OuD=MUQj-|hVGi($2P z5507UR8~U0n8%jkr+}I5+XXXVe4LA+>mFGDX#`-e98tP9p`bq}{qdaF4QA;26m07u zp57q98)N(yr}Wtuo_UB6kpPkou$oA?*touLa|FPMYovS&GRZ!_-YWU#`D;TA?B7`X z8$S^6V5G5af(HZuOhB{0lb{P89Nd{F>2P07VU~r*x!=>G0VZ^v5QcxC%p}24V{Bh& zDFzFUNPMO+uDk%*qJ$rDkWJDD!U-LW(s7|@19oi*(u8hnswPgHxwSC z?uj->SCLp4o6TN)##V2uzuE5~I3YAg!THZqb&n|8G@Ff496y2{VZErZ+0|bi=1-5F zQ`cw%Pf|QDLRHn2uH|h2r%4>iQ=p{~lL{pGMAEPphJk-22WY)9NXs%m^G)raMW91E zy1y9;C<0SS7t%!?eC@V>bAG z6ZF>NTeTOG%tFmHOj(uz6-8FNh}Q;%I~Fp}Y(TRvuS75zPY;qcy5qP8n5K>hE8K8k zi4DQ^o~Ms*w+}%F*dSc^`fcBX<67W-M{>xj#_=5JlCDgytRWuRbui}eZ;%k#cx~tOtFVLC*H0rBdDNDpl^- z^k%-qcLVRnpyRyswc#aXOmtu)vmN&E*w)CmZ+cHAwDbNJ;0{i6s|76(n6ETfJoD*H zy$Ub(#f;=o*NnhH&6YLi(!xEz$4jc46$&|e1eYVCnBhBS^>T*iS^xc$SzQM230yT^ zAm#Od9p_@T0#CP}debxvRgzemWd)H@F@D_+0YPqDWG#p=K!Ra~zTFFcXH@OljqFx@ zMSiLNXp*M=A_|q#{|aTH=XzgvZ%4fw^4G_f|80RbDnmXtClw|I9#1=j|mfOk;ZDGx0U&O?-YBhf9FO2DeZqbkdOMhwuZohPA>r!LN^|$iJS#7T;Mu_88y?f_fx=(^kUvOE9%$Iij zHDba4MgweI6efJ z6X>1+SX+>-UbxGH&r~E|+|yrxr}=u=2nZk-P+cloYu&w*y+x$SNF7fK2OB)_$jTJ`Cd!lq>+> z&k%bjerCs|OKXJN9aFb}fhB1i{egi$52}Pa%3HoD+tvynOv?6cI(^N1s883kHq-xP z>e#_89Zo5^Z}CdR1+tN|Y0F30x~_?P>iDRv_u9kC#&qHYUUtJnN?m?vE%o82GxQA@ zsWOPlp?YC7$KLa1R+_NWRq#Yz!X;Q*LReN9P@*8RC(;5W(Qr$Fh0EK3Mwp4}8r$y0d?IHv2R9 z?$pqdu55EseaKuUe86v&_%DhsY{^dwA?kzy#Ga+F#A3u6V{YK^pk6H=-#a;Y^4E{H zG*CV~?DzkJiJz^@Hi$Y~p_=&-1mWkJ8thd`!QR_->-dU_F&12!boL!4*z3Bg+lHpQ zolQ$oG{-NU6CC_Q7a=pA8cP|LoCOMLJewi=zFTRh}+GXDMwLlF9i9u4mX~31V~Z7 z#QvPOk1N~SJ>E4*IZvmU)o;x`t^jm3le6BFfs4o0mLF@Fh2BC@Mt@>!&rWd+27IQ7n~qZO7`UNL#VMIG;6q!h^#x(=9i)?gs-5Pi{uXD~H zPq%+WKW4I1Lbw8+)w<%*m=j{=tP`&n%cd-HmPVSU>Q(7s5UjA&;Nk90kY~x5j&!Gl zPel1x8B7RHg6+ESVks6WPor)0Le(Zl2joZ~Rw}ZJLwqKaU8um#JjrG?*L5t^){~ww z>>9b29t+?MfxS~g62|cUMty(R0TXa;OVJ0gr)m~{74N{a56;vi&0lYtt`jMKqB+(R z;~5!60aN+-Fy|TYg>Ap42Wb5GwWDejTHKZvKC5}geKRHoovAm!So_PAE>`h%=R-?H ztsm-g!us8Apa1dh_2vm^5G5uRK*+g zYqTH7y$!1ccoPAYtH6~pX$7AW38ae=B;Dv6KJCdZaHiO57EFEN0k{h6E!DO4iVBJp z&fNb#r9}ws*T6>>jMam))k4SlmpIpxH}W$1TINIX_rS)hmM_Ee57~8w8PpFpey(Ow zPxbNi2e;ZW3!Zm=!&)6dwcnn}I(iYeVOSx-j5kYmc^nY;>eb zbZ^C^O96B;rZlw9^x*CWDhglu?x%H*^kX06OgW{@A;EQ!c~qJ23e+Re`zs|68%R=bctavrlBI3Jq<7RE!1)pPp}|1S_Z^7uvYM_628*5}Y$a zZIm>*()=lSluY}nT>;NUz%ouvPkjbqc)J~0d1p)hDvg?o+?jVmwV(kGU7AYJVGW3g_lH4lJkoy{3rQXQ%fC*hEpE<7>~`^o-_QIy&(*EAb`{K zF>AxE;`Ix8%`dz@x-ATKN^jDUZdn>jY!pc-AlqtYf5833h`0sBfakdX@_Q68ik=Aurgcu7$Sg7Q2YxnS58mU~y>?+KsdIIBl!uL9#>Y;Z`esVJ&p+sP2=#Udr4 z+XI_7zV?TBEThrGTSCcG(XphBZinY{4bsH^*l?nzp;0Mwe&;(%)42jYEHij`9DRM3 z0j7)61?kqGb6@Lg!HLM%AF$j7WgjcJc*Bj*iWr_J2NmFwmZ{Jl*X-Z)Jn2%q2j)#{ zbNnAR$QCRuGvU$UGzv5%7k6_x-0mgQZHHAW>~t?l$E{R<|I^u>yn4LvYkaRUt{0xO zk`33+VcYgQp$4S*#T=!4--86_)Fk)-e`~8Pn*ovKVYIdZ$xGp4?6|HmlJ#P`Wv95& zg%2FD9o9AH|I-9=7kws#QW`t`AF z>Q|dhKUjc^qLAyWUt*o3sP(gI5w;(O0U`wZDJzw-sjaaMcHtas456zbh7-gk>qObwYqzhgSj4jj#Zzv+tL3Ss zfw$g21WHK5rf-7K@};&qwI*u6UX=${SfoUVo|xE8dfB1W zoP5-pbrx}oncDfq7{$n~j+XK(Pd(V!=S&P%0}IC0NJKE~_De;59G_u zEF-4OOFzl~QrCaCKLK8S!)8xF*ua9i_pFgD?WeF3ivSlqR&JA1AXz(GWg5ujGq^2G zIG*`=JSDYcYvtRM;6cQH>`iz?&Tkx_&Ire_T+K{RU9(CLR+8fwb!@o3$i+ys4$zP8 z%$a8T52h0%lBeAak98(~v!wZlBLiSP97Di;hd&*PsJYwaP`hS=P9zeyJAb%Sm~kCWrhKy0!twqF;93f zcy7jGeK3zVh{53Cw&Muk%c&eZ44u*pfqy52Vmb{wlzE03-*QKo7-(QQR#eyuEh#EN zgWIPnG`-3&Ns%ifSt&%&aAcwUNP_6!I;Pt`+_p|V|q9xN~N>r&$hVb)q+=v?L0c5gtVv8SqNv#GK(f&&H|%qHHa zcurr%c6VtQTk*Ve=ag?}x8cBqB<(Z60TDvKA*(7rKkxMH)V5cNYHUT5&_q(o=~^}m z^f(mkGGpz^GlhOR?f*Bl5B*1u-5CURWG@-0YfU;cRo;>C6oTS@D<0kT*|L<9Jq-vYiH{3LU>0L?>a>z zbrwx~V8Bt)C3dkLxC*|Z0J~u&tSkvNLQ@9IZT1_w7P-k%$(5)Q^x36I*zx5*UbE`& zcW&H`E{t4IF{gi?M4BSnsLS%e_|;KuqapiRi7&6-p+w4 z1z~({XL(WJGC&Y{)-%X24|k-AP`%;5JdV>yuxsaUU5OCW&WP=^50-sVp@~3C!joem zptw1Ie4}E7;YVPcIVp8Rp~5gW!ajE75cc+NmDVlIxi8cSNit2cjZTH z78wj<9=)D+mIU~5G3RVNB}Uwz-7;|xFsy7)*v7kxli+IBXZ+?G z!&@!#i;h7y!`PRNbJBFN>v-9iLms%7jraW*fD4h=K{!xhFjgYR965XM9+f5O8BlCj zn^F#NmV{I$I&$hEPnX{;l{a`f>+6ArwAIIpa7fZ(clw6*SSO1$mEdw#+0;qL5e_06 zHiUZmjLDu;G?lS!?_-hK(!~y$0&9be5&PCaY<)33ShHoOrgh|!sK1EY9b|qjmxpI} z=^$HnRUlcOkSS1u+Dpcbc2zs393a50!4tKLIPtP^!#Z+(4x*a9io#R9{rccSS)=VI z*Z%If-DT0XO#70rITZi@2`TEgi=O4IcA}q74rfuogUZjenZ!yAP{>?f-M!Hb$K}<* zaZ)r{59l)O4T_GYF)y21aO9145%1=>2m}5Z25L?;joU-vk}r+* zl}t!cvkIphGI8dPJEdr-KPARwrVzJzM>q?DNxGO8ci$wX?l4y%v_bncu?2+#&WoAGWNlEURiYH_vp!^^53gJCnG@2R ziIkBZTsFrhitVC2dTy5%=F6*Dd6AQ1^j9-#UQt|oRp9M=@nibPft zRM~2ODf3oZ2NgxKhf~6*z5Ik&Vl4?EU^4RHBz+l&Yn+;hsSj^3H>rBNx_I0c(LjZh z)ZP{z@6K|!E>171OxW+f1SsuD{Wz&j20sQ{Z8q6JVA`j8x@AqK&Q|=Tba622eG;Et z=jR{z=yq#87JEc(8CgvA=T%J$H;)>(3>wYeS#)Wd`$b=GXm%TiOGc|gR(E&er0K7$ zH$RGaD5+;1nM>$!_4G$}PTq4g=bT?k>aSeO*EuwoF5UM3ZkAnOq_m?_YK1S8x$|kG zlaH^xBIj#(&wf?4V}l4Ym=$7A}TZ3=2-ZF7!5hR{(+B|?gQ0| z(atk#zA4AH6Q7jU+Okx|*L4b0?&9Y$z}(YP+8i@8(8kS8L8TvqP;4}3g6>YceLA%? zd5`k1B2ZoOcrLB-bp~5?$@d?8+t8n1i+A+E+&7Y{m3R#;l*(I{Rly_mzF10MQZ?!LI$N{AKvM!odYJ^%VlIRP&j2Tt`hRQZ>A1R}k=8`slw3BJ`%m1TOQEYXcg4fd- z%Y=^EtJcGb>_r*5Dpj+M-9Mz!5`dEZ%7u1lWcy&YfhbkhLUol9o%;{SV0uMP@7yK~ z?om*)=#JX-ElzM%FyucT<5cW$ydNJ9%dV7H)#GN6WcUDz-9F`)W=) zY_$ZMV&?GaInaSjh|(pzeZKvNNkhbjVc zMQGdxVLwBK;9|&%Zu@{nS}iWyG@H#)VQ4e;pwyw*I#6uzvt=|=yra|I#h0c^f!rUO zeU6N84A-3Q-f{_G=!ArjZG*r{`629syX5o{D~g9rqtHehMR6h@fNMjrWMz8eHB-^J zNAc{`xL^qQ4P1-&;cd7k68&jPF83Ib#XA;)b9&Vk;rAMh;wBrsQUn&J^_O+Aab>wC8HdOp;Lh;;0f0mkQ?nB$& zQ;|?&r;UB(fxhK}5SoDPzCCBrCbn>|LaGFN%`zBxh_&YN$68-dT}%sh&87}pfn3{< zaWqgF2F?sk3=*{)iO8~4ov*2s?i!J0r|kW}wWT$qXY&STd}t2daLG}E9)(Hi4%OPy z@8?=0X@8UgtRMZEbz|1_BKLMh-e3*1R~0n=I;ct0LNV%a9wQk2Cm8*q9jHPxCul&X zCViBcpg68(=3m$LK;2hKr#MY6WqiS|QNk2A)vW`sUiC-~eES5)1fvjzB;7LR1kG_AUafD?zuannj|Z@bQr= zT!-k~TD9R*Pgx=RoEVc`xmGVDI*sx@7hcJ4$L7zQt&Ir@FWDWeC;=ddV>CU$*d)P} z6!uloyq&tCH`l@gld&aA(-n?p7*=B6W&rV=2xHr3mvuETgaAA?)XGD|dJEjs>3q?a z3g*VOA>EoN$Vz6|Y&{+QMEr%k8W0%#^fa+rqu>0HtJy>%PvKd4hP5M?gDz&Pbd!HS?n9z9TrP5Eme=?PX zG-Qa8B75E?Cd~~P;AS)g_f0VT)EM}YMp{(Xep6jk6Rh>+=h&vgvG}#cFZLy;GPUan zfWt65v~gi7%~VqK9}!8E;)SrnML3rw)%IN1(H-&}gmOb0vnhv$Z4zsxAe1oX0s~lY z$URyzfp$X}x}h#?&PUMNGmR9<^OAo16rQ0OPM|0h$gq?Tov=V}j8(wiaHGyZIaz$z z?gw>T7$@u07%t0g%~J@M80a}ckO>IlfM6qd?qV8W!#+SrcpUho@~G1D*Cu!5Bl{~5d@bMxpSD2WA9OG_f6nDX}KvXoCn86E-r{V6*qrH0uRC{U- zPM%tf~Fm31+40}z2q%rjp_ZA6DzfW!mm_x`8f9KeY1vaPyHRAs3{&Byy&a7 zTYcL^Ls8q|k$+ys3gJ3oNq(n9WP-bi;}WI*Szl6PxDICk$Od3r>4HRlPBd7Pj#Dgs ztVO|r)%svrhS1R=ib=;IT*Y!{X8$|*&@lM2Wif56GfWg`iLTnTX%}@w6c2m^U}0TL zDWJ^X7|Vs#>1EkI**`@d8>%P}@9)oyfd}p*0eb{d;0Br@71Qu zZ{M-!`8V#(e7*;ZhWB^src4}alYJ{sJ&XiTKWhtpZ!0^pf&zZ&E4bFW^;IP-lM9|h z{F8df6FH^atGt`_5~rv?fAPqRh?y(i{f$50cs(WE{X+Gx${Va%(@+$x@?e!xJh5n+ z<=#hl6yVLVZ&Kog!-Rag8}rX8EF(M0ya{&|n9%87 zud8t3U42+Os;FkeVf|70nXHj3deZ5$e2RphCo6dR{X7^7kzcv4hV2>Sf6xeuU>6eD zCXYUqT~!;((|G*g3P18m)rNDpYYLZ*p=A!RKzcpepSpaN8Y4`+?P<i7XBgb0} zEH@3cwTb@+TE4#g-o&M${l{mmOZCiZUwbT6mSX}l_lJ7&XH;!#cw%;orG;X(+!XX? ztlRZxs&~*%WXdMddLv_XNyc#;t0P+BysbCi{X4@P)7|vS;j|(}K~Klw7IfU%+wN{T zhiQ8f_AL>Dl-ca?;<$LL2HqjiC)hm(6*Ddxw9(qnQFD!!Oac?9Ndtn zM&5lR+cw2cA+-*VP^sOUJHK6y16A}8;|8H8bePT#G3@=ev@=ltAFV*hqczz@_2GT_!3k`MqE9V#?8XyS9h(H#6JN7J6W3`1uCt zH=#K3D49ZuRn+*cSPQ~>OjJyT?$a;!ovl=r%GVxPoGYSpyoI9gx0c{jH}(mx;UsA_ z-=L45?hIYMUBGaO>{Zlu2b7+5}T=&E`OryTpiEj^YB>c*$pw})LJ?{(1R%5Ir=ZB^sH-Ufi}Tqm0A21FeEiM>vWM86iBDFx>K!B)vojzI62M3gxs)i^S{a>Y4+N6-AaKW&?X`ND6I{ zKsT*wz~p~|dRm>^6*#=+IzhMdDm#;~#otU;YtIt|C!xQr&4EF&}VnFZ8YBNC~Cg3 zuo!BZ*rV2!cc7}KqV#1F(bCbXKs;#GiQ1a~b`E@goVNkjt|A(aV`KAg-1hisj0mbC z9ZdypDL6%*YCU#u4LwVtKvuqvVZ8ua6Hte0vEe6!miT3^&NHE-eQLCjcv$f;+?fT9 z6NBrqU@iV&QSvg?;HVE*8US_y?Au#ytx$ioiDE7VJM%^mEDJEa|0?J*k@l&2&HjXf zOR?+=)B`ikUzwwFj&*neZo-YiRR$xbv06TpjzS%2^>>@*GajWz~h0mQsfORy zcYB{Q!wZL3u&Iq47K>Zc@}hMGkkB^4@EtPJcJJPi{b9c$44d_q7oeDVqq?w5n{fF#e;y3fjcs3%#|BaIIU6= zF{%?1C-{J(+p=QV=wni#)=HUzV5U+rflS8GG@bQn$dlP$Y!h7oTjT{#(@*sV65h)( zQ7!n28pK%{&=X?=MTx!Q{%fN>w2Fz&sb{4Uu=6|+Zo3e1Po?G|0@?VDy(3uvAw6uI zAur(_E#k@Px?7uGzSY^@N&{pyw_M4twxu6)6m7%sNUWc?5^O(udHC#h3%>=xYAl1yxfwhuopII*KFIvc=QAv~={&YN1*fQdxS&;(*R8^Nd7V=yPpk(Q2gExZ8f>xo(nc@|Mm24j;VsJ(+^sxGzXmGUejqf|4F-YOVvTx#AX+QX0s6>@67m zTI#3!neA9>o_}Lue9`q#_oC_P8<^cPCawE_7@lYB8#3e?GUYZ%V&hWg2H>K)w4$V) zD_**Ljf81COp#_Z=@|;8-l>x?>UMnUA39*ATU3Q&@v#&k*^FGHS-GTf6)ThZsG>yL zRg57+_0k8S@!H5r6HyvR&3XNvdA@Dt0|RD7(8dS24u^6fcR5T9+^urVz=`gePJR~! zLmEXJwkwt0HCztPQ$N+Q>C0E|wd&)UZ@sNX?Z_3wz4^1KlKXL00p+#3z{7CxpXYat zeVMP}B-4DFf-Prp`9n1JP+%$z!VUtc2xGGpO3|2bD9jvI_HXM5Fx(Z)#O008G6{5J zLNl<9#fDf)`yopyif}NaGJh(ICu|MbPOn&ZPjg1bNTysG*>t|}@ROUeV zdjb(McAn9UJb} z%0&ldHvHIhm`>Xjd-?;yiu^F_3;>*IMsx$9O?+iy-72`J_!C*hX5XG(8E+dGt65GHl$HUw-U%W zsIE&$^q95EdzC3ReBE<%u5KPK@Aq`y#I}778A|m$!7KZBi~$^uc?KelztHvzHTtnj zG6*(2#UyAsVWbdFD)mOi8r-S+Ex%298^|$hS9o&RDA5lMP&Uu%y5(JYLy64IA}(*(2yUo7F6K-re0lyQqTS@+Zj+*%%~+pz;l6*iG9de zi&bWLfBLh@Hltuj=;?Hus)oIGrO44>+wBVjswByKy{7>#J2S_L%^hvgH|GuV2F1*s zVY}mV#mQYCk7G?tQVvOxTTzt#Yt|g_2_eyBwt!1&vSv?CQvAMbr#CiTC?)d?ZGst3L-y>r{tFzCTX zeCJvY_lPtM;hLc#D`^4{R6e4zAYth%2%SByj!;cC#sbUCP?F`F>$jIw@V6q|@2BIW zVJJ7ZLaS*vG6WpmwDJ)!3T;ayq#rZ&xF%1MktmZiQ8%}luwEy-zi|_gVeSYXmaeq-!mikPw|Dt6SN@3g zmV3Ric@X_$XF%x*AvkIhZ5P6sHa5-8K28~`v|z1TV-SY!Ep$_sW*_v+Doj}<$3ysV z65mekz&&ahOL%uW@aT6lP3D0-!(`hJJbG(x9NBFzw8drtD3@b=ve{KKMV~-QjuyMP zFyi^kVI@V>1+7L+DPx&2qq=NXGSXt^Ue3S-s}d#asi<;L_i6=DyhRI{ie zDS?kAL+fSXHegPfdC;~>zf3YHNIU=FAte~7~GHx zn7~^Ja%qp)HSfvUdAdpm;0QT(qhKz({OX#vEWp`YGd||Q|BgaksyYL$ocR2;`(;Wi zDuXk!pn4&aabk0X0-_S#BCK^fPMf&NA~)Yw24|n-~!Jc14JtcuwZaEoCOpNWh+_m1G9kN>@&tV&5sUF<>qUoZF|DAY(W5 z1=#cfo1E=>vg204wr=}NK4@gku;cB{wM#=ZQ@X*vkFD;C+@{g49cN@6+ADuhVCKU4 z+DF)PFui{r?RU>o-2)ezUTMGJo?gqV#tj-#+w0u-tF%kdb@+&MhGN>pb)P!l=j)Au ztida28I}7uSGp-Jzt$RqdIM$pfr<((leQW$V$(HE=LAV0q9iNjP=*Z4&>0@M%monF zAEji0veum(M3u{EL=FDQ_S}~rEL(1EdF(Tt#pPlD_+sd7aNc@e(@a8#LZ*xhHd8g% zx$x|l^^unk6sCdq@@vXGzV(utqK%d-mkd7lZu8|8xpsXY7UW>s_$)4Hu#iDK?ko98 zuBr9&m%&>+qMZp9t~eKvi?zs!q%xjHfrr_qsS&kwh;}jYz?KHyb>TykcB!|hsXb;X zii^AG+a`5PY3Q2ja;QPqaXn!L?DPVRluPNFP)fV+p&n_P|bd4|`*QW6d*#Jw?@@>cU zeH#>*0R1Y8!L#6f=fB7hM!cP!=a8@rCr+hPstauWS7m_=C&`k)^O|>^k)VTU0pYNx zd7emsWjTMw@q#GJJR~f8#={Q46spl3ja4Tq6z2-iMm3bRAW>PaH4vul=>q~`iWd$@ zlPCl9X6A-sS1Kbbia$y!$cmr|W2KH{wu{Gl)bxHs;%dd3Ld$1&VV*GFdvtsioI^kE zH>K_vx_0$9@Lb)XuH6uJ5hIWlHT1*w z3I88-72xB!&;NIn8$zN7Id$Lo);R$&j#bpdczB$}EEq`x73&w!jZ zgON6T0XUiT5<;~Uzsfh#I9l-wOp6&kUC7nHR`2&)`D9uPHru+$hD4Z;{vS&|9u4UZ5jMr#0RMV(-30SysOHC>Mu%y=p$xSK{<;m25a7Xm1}s?a z!5|Y0QR@|Kc%gIam)_9+*J1?lEp?DNyUcpH2sYL)_a5F{%L%M$hVCYw(XDp7mV&6` z)FT@f>+w@zm0EQZwzK4YS9!E0G&1C=NMHNPFa6^FY@Cda4RG!2F)u6Um>J=!2iJ6H zYJwE?M3K(2nVZgAWwyk=UO2)nW7i@fU+!gbWR`;ukGpIx zuCL-37Vo&W8Sm}%16iEsj@2>Z#u)J5{-{0(r=X5pbD!^$-LLox|C7{o`4r~Cgnc)> zRp3wVxcxSdeSHVYL<12^81p(`_;3H>6cq3zvslt6^lZS<;Sq%or9aw2dN}~~ZUk39{@eF5ux%{qk32$p++Zmr92Obm zCd3eh<(P#nn8gZ)0SwVJzg|*YPv99d=p?8Y=0&u$D%eluWZ88!8Oll%b;?Mo(Y>z$ zMy!wA(mh>w@0D}UHiAq7MVOGadhNg@t_d1;&92cF6Mmr;#_%)R63EH=GS>OIKS(KZz&>Li3|Kr_2;G)br zVm>P>A*3ExOQFv-^~yEfI)ob8t?7%?zbg3sex5J;pWn&a>}nLG$m{bG?noZV;6OqT z1QFYcEey~}+MG~$u3tLAE~9(PVoQeuJm&{6Kb0a z&op>Y;bl||FV@igY4ZStoZ4QvudwNZVma!N(nxK5nv18mHzK^iAjHY(T`*06-3lOg zKZ3w^H}B`6@~-ZukaMi~_o@&i<2XEz{g;@SbeFRViII?th7PNl*pQXwzExdD7Gp)& z$jqJK84(Dy@%9%Ntifc)8DMEFQKaonDXL%03pNph0{*V3zh*T!9JD^T*8l2bvw z^Cu&x>^|91gJcWZ^JOMnEx{}rqtqz~h*We15%(HotSEBfP-0I=2WuxfaaF6ehx)E2 zMAOgP`lT<4f|KeRSwBX0XIdz4!yRDE3etRtBZNtNU;szbBS%BW855U(Zw}U5ZEaOx zMLVR{T#vkAj`v10#%{sNeN2GWiRC|FXV{9oXw5WUOKjf-Nf(b2*kEVFsE2;py0!v% zDBG?cOY~+vlcTOjhT~Z>P5$($YLGw?(upTevNL;mSN0?HU3;XjDpqbsB4lG{9lK3} zVr0`Z3o0kA-1xd-64IB0F4tGx%xKe&#rtD#M%EnGlfk>?F$GF4Ss)#`XHFpz)dBqD z+w~ig)w-gyp(&m8l~@etb$pCEMoA{pk=Z#mzP*K0?jb!X;|7a872wQngO}qTTwZ`e zv~UtnP&NmBIV2Pi4FgtnGT?#RlLtW76bO`1Scs^8A+Q8OByup4t4vcu8L}p8>~6<1 zKdPScefg&E;m@FmL=JoAzud@&xo%*rb9Zj%`d>duTWUgEdi&qDftn|)>D3lASJIQP z`$br&6~b0kbwby1+_ddfL;|{zu2^vx$<^s4Pbm^|#}K!+ z7zsO?Ap5ffhb1Ml=Jqih*mmt}*U6(eHx%znjXJ+|?i#&53$i;}r2 zCPPO=Na8)1ZHf{aIaMhz=AKtVd)gSRAdr5YW#5ESRnv2J0b+o7zmz0A4}X^aw4z1% zsceKQk;6vugLxxJ!2)r^ohlRF_D*PUB_Jpq@0<%cB9C&qRm&2t-HR2{4ANyY)M64# zq!-jCXi$*AiPwZVs1ZW#uS73%G^F4yu}1*`0z{8J)^_-}S02X(o;i%-wqu}P8!_t1 ze-Hn6mW$NHgGbC#r9=XF>AXH7Nz+Uu8Kw>QH5uYwLJBtY^{ z@|LwpqcLY2Mh%qgRm9@bE^AUOUQ-mg3s=b&>z@VKT3-uG-n_Y2W|vWe4G_qgBD-2H z*9SYh`Jf-H-g{JeEM5u!XX$+<10J`t78Z@qd}H95ZyPhD(>YY`iyGkr{Z{W}?NnsD zqdLCR)TED_p5X0njYZ?<)+E03+fih{#Qx3ivi)C{pp|@;iU(HjCUJ8u_^U|A#F-{%$wi^@6Wb`3JS@5`Ed{!|J)OLrIE{B72uN z?Ljuykkw`lhwOz|hL*k^%%qvLcSE$x!Z0l@t1>ouUbqNTYTC47R+`O9sZt9oi52TC zLA{9Ga!-&r!p(>;I1z%$IlpjcvMSgkw^C{h;>SWH;+53MXRZ8ME$7zLn~gfsq8fiK zDnxxiUN28`@Y0X+)mF=f1Yw>?sPxs+*mZ1pCJaxIt2&l$;#??IH@hw(m=c(%{fPWY z>3=SbcLSb0T#6CTwr&DS?MmB4u=@+y)GKxLiVEdzKF7rSS1(`BR=qtF45Kz0)lDZD z@BuXPZ@q(!SH{)%@SgAlP~ANre+S&S?lvo7{`DN1U25F!LZmBU=@Ej)wvWidl(PjY zrj<|T^jkWGQBMf_r)OGE=6fugajjm+?iEUZH8F%p^Wo$|*E&?>o04zY$zcx+4 zrfN4zu&|P~rW1le*SFj+RK*Cpnq7UlH}N)`Z`w6bmE26YvT~`_0W&KXr2=}rcXK#% zEKM0AMCu_{RqBIn^MJ`%UEWz%v~)uwf@W~5qu#^(-Yc_Ga=nkz8D8%uN35v+G%fRY z%KJIaU}9O3sl~aP{Xpx1aE1w3t!h=l>+CgVLR_jf8MmatG^lxiBsM9gUeBXKQ2Dll zbPFOXNb9_>`e;n(K%W*hyw#-4?nrnehluDl;Jv4tk{c8&x#FpOQq_K zu^$*a86A(GECpUPzy16Sx=4HUzjhX-IR+oH7R5Cy`7l}CP~U3%*3CNxM~9B}12+}N zNhIJr6eDnXFH2&P4UBOpt{B)7HS1I@M8qP#WH8xs}{r3_M5XErF<|Mv7{ME!*O+Etg6WD zAK|f7DMiA}&%x0J?Q(pjAf0998ORkG9K|`d3JW})KLtH9SV%MQOBDQs({5Wxn_qS= zhcpl)uuCm;$z}Lej3Aicfx9)G=|2MDK+JTIJUvL99x{tBi6X_X0EZnWOlPwi6az`u zuUya^T}c`?`FOG;F9b8Ge^`?g$CrjCNk$=1&;AqdYS{dbwfKcxw(uFcir36B&Ac?U zxfIm*l!t#i?-KCUJ^u&t0BQ0;>ph!t9R>cG)duoHl2sPT;S__J`{{K|O{8@qGkhoKZ3_vl5i@3}~eT&|zl3 z*g;()8uHf5)Pe)TG$@*GNuqQ@jMNXDn#3TMeZ;_SX`oJxyIrdKu3>F~x0v$0Jsu9$ z)cV2jp%a9kKZ)(c$v!Y!`rS6Uh10=`e3(RUfK9zUBG0et;2=fEU}?%`6kAT|;kRwO zCojNurDdntkYx%hr+>v|);8J;Oeb5Mc5BvXHzU)&4^#Z=zR}kuFGHabDa$xX@FIfg zWYMWAxfWgw{8)2vIJJsx)i?!>O8>25(2n<>E4zoyA`hi|>kHQ5dYpeSAz4r?eC4$q z&f{r3FpxlT9Q^z6_`h{H%PR^W|H(IeAd4L>IK<4=E|;~2d?uDC?ZMhg{b#Q2giTd0 zg7}>BN=F;WDb8mHwi7_YFzX_xYUyq@o+!s+d4JA)WWa_}kP*i9Z9`{MmILKxMFauy zNS_Z&r+(S(1a4M$#(FwKsHmuw%i)>|Uld%}>?N7Lz6ftcDxcGMoD<8BIxVFYP-6_E zA`~kggqw*IP=m3spk*v2z#_4gK69*FLN%AC#E|A)3K@a!J3PSGHIQX%!}DR;{eq-?l6I#VA z%Lbu}?8*kep8+v#$~56a!n_M!Pm__W;Oi+DhD+}WCh#Rrv<|~+44W}>7|YP){rHIg znwb_zKlV+F6a3<^G4ope1DX^2pn7-~;+ke|?hi6*00X<8S%!6UXUU`Ek{4^5&DPz9 zojA77kH=4@t)ah~1`RUHt_bcQFBke#a+Qa_P3mAy9fJ6uiH%=*jnn#LZZ@{{0>+V4 zHSY6^qLHB4KTaoc%<51^vg73|s7{$*mt8{J&p!pr;$v26FKHgEWnnp=TSt zxE&af#ImwB2ZT#YKyug}U0B!4OmtiDocV0qA6Pb2f)gQ#I?q^NlG3My#f~5FENzyT z@WDSRUUu6zUyyudT#sAu6urA<>yk*bHA&(~1TXGRNDyL9-6mD9kP+uN!vJaKdr_(D ze4sKsh9XT^wTxA)7s4eg7((xA!%82t#aNE{Z1L*F%dKFOwI$ngH_J+s6y)59F6=e$ z;=gM8T?w?x_Xe2O@BATP_}R3uuGGbCBNSwpO-4vKfyBSYzSN_6#FaXG77m!DatnK+ zhSUtnSX)Jbx=t@GHF~MCK2s-7(kS4Xf$7^u_)db+@hzlNFW~aJe~(r3(Di_O^nxhz zc={i(*?A=?m=31_UZq*o5JbccqRF;yc0TL2+ zs&FcC$qQRlfHX(s2a(h)fsmB0!I&_aFvKFM8p569fN1%gr21)Ld*)zStL9?etpFOw zk7bd~+v0J)f1)fn!zo!C1ixT}VDok=5ebqR` zqUXzBZGET%ZP}6DE%QAy`phogxK4IvM}4hhLfPXZ&ct7*H@-O9CLo8a=q)SR?^AG5 zopJdSLq4N~s96U|rg1!ISo_B+HuFLN7ba;Q2P2HL)tG%S1Ao@5g-@(4qG|^VNvmiL zy;aTX2H9#MQy;x|KT~LS?iLqPvESxtn61w6q_VA!s0MO#$LD5ox2mGoaVm@mIs@rQaEAP-&jMG0 zMtsmu4fX{6E=rQ|O0A@7nag#TW*Ja~tsr&Mk>S!bU8_BKBAS;Ei6=8E;=**&IYPIuH&?i2IJ`0mvmh>~DCn|`U=VEr!?F$HmBW#&J#rll<#OVsT05%G zkssU^RmMB2g-h0Bl!TgHurIKNc(t03c``{RArGEh;{hyc~J|6mbjITIfzo=(#J6|v+ zpH5_!eYXHj=-uIr@pw>+O)wTy8KSGaEAD0VyR> za+r!07e#TYYKvo51mqi4G2N%^?ORA544^Naj8$zGh)T9na)&G@Wh`?P-r0e#q#qPk z%EE>zzVzx$dbu=>ca#u&FaN0S+FXku59DJEi^clfzf0Qo%K|GBoPcjx4dA9mX2}7t zU!}@ka9PU3K-_#?jZK9vGPg03EK)XB`U)CTJ3JS}H`H?-8xIOdDWw)zLw;*ApDLYm zV~~_K><;0R(Q+ScRNJOX*AG zDXMqwH!V_z=aNHIh)fa_AtF~+*=!53+vmSgd+GxNz+}?MgWja^uLXp;Bd9TF*wimM z9AAF$NQz-bYdD?7W~bdUBQt+JHIK)oY$@o)(1t6jCW0p<2$UlTC`h3wHQcL;)1zX# z@a6}UU~(ae8XXV{iR?KvRF2@_F9y)yE@_}H{EI!XD2*d83#;Q<~5#1vJa2F4+@ z1}qPj6u^T5W-BWOi?YDv*5P%gRwpAK-f~)gWc7$kp;=jW@ORVlJvyu*P2qp{>+{+Q z;GzRfMkU0(lJFkJcG$hU{`pnUQvX)mV-w4#yhEnj-kD^I2phKH zdVi4&1!#7_CEB*bo(Z{-yR0xREC5f6z8%uQwrVc-_rsu}0vpNlUD1&gCf7((Ge@)q zH43n;t&f#Z$~ASTQdL}CJ>MPxFm5sa|82@k_SZXtzo041O}dSKDjriqb~}6dr0tyI z)HE0`$ldYy{XIqiAcwRZ7}xzV{ZNEhUp<9baGv=^Ins6;8j(AFIJP+E3kxqOGFkm0 z$t0P@5~jpohEJY20c6d^z)IiW)EN~>t29MdYvtLe{|nt5|6CZ4VQn2!9)EAm!R`Jq z2X4LGi9J0sSADeddZSD5#}PvM@&8^>t3uaq4(VsR3i{*%4cdxP^`Rg5gYL7u1aQy% z<&-E=#PgCEvvOTn*(Nv_UWM=AEqETD+lVI3fhXk^X>Q`govNf8vjEe5q1L#jCWeSE zO2TqnL(sCANh|_%bgM@fr8}gC=^y_5nin@u{er-Tn(tNL<2iiPmuF zyk)J`iuh{vM8I9ILNKFd)m9!3_`FAVtnSO0?Auj;rYIIgT)cN*PEAb*O6if=d+#5x zX_nKR_o-ybT^((apdg1r0_f#?l~yDDe)Mn(;OH0%k+C)UQCD_O+*hCx$R&U&9rdk* zTO_o#gk{vo`>ts^)G0jASx3INENU-0kSrmjr~8u7kAkeZDX`Vs&*AZtrwd)cl9wx7 zv{y%ep}W^<>FkyyK-1PyAKDgvS~KdV|JEQRj39A9fwjvNlQt_2@!A5N*&d48tK05N zO*>)69dZVQ1b7An@~8u!<`L6`8dY1TDwwU;I)W*xkRe&N*2F0gS0?1qLGS%CJ)Pp{ zO0F*VwcF~avnsbZ-F)h89qg2SLBp9L{T{I<(ZUq+H@nI1Qigw{?A#L(4K%iT2}u+X z>91**5RU2m>Un-8vZ6WXzGMtZ6&J~5+udg20o-gNf*WdZ198ct&2ec737BbB!~1+B z1ztlKtn1w&)<7pzb`y5sBWzu>RdpC~HfaH^9O9?Lb2LOO$6yX|jc0SH6S;8!#d3oNdI;n zShv1PCi%ZbO;cv1gR@sD@j-A;EU)4UH!SN=UelKyDC9$F-N6d-DwQZMX;f%`o-Yq* zWM4RYCyKAy{{fj8lw7lUHX6=efQHIOvCw`(zjo{ED>IHdnD`Sj<@-0HfxiC^&B-+* z)jO=WXUB?+Oz)-kl?luu?83_NDq8Z^;K10=%lNNBC+$fXcKR-Fw%p3#l02CTh~=GE zPb^X3`Mus|Tt0+ILx{l$f*C-3DjngN>?rS;dwl-=IL!UET_!u6{HVV`d{T$Tov+vS zQLu?5eGjD_b7ykCR<)}>-D8q7Xw4&l@|n-h?QBBlaxU=I;SUvzZtz(dVeeyb&2o^| zxh@Ucvrqmg3429-Y2Sc1%)~1l&WyNX8FGkt47dxS-1|_t@v?rAg28PR$gmt2HZsh~ zbAtAI=VDa@FCIUL7Zgifsd0g)sfMY9qsD>WugV52I#ugw8EjF5swPrA)ffw2cR`+1 zzf!eL1oO&mxhv!LBB7xZ37<+SA%FuGr{y!}DsMx5v=VDnER%CI=3F^@w&Uh`bxo>t zIOk^)MTWWb@Sx}~o-kfbvtzKh_ah$9IyvvfAxV;rwl-w9X;vLCHS25YF2GQ-%;j3@ zGO>~O9cP$zHVQ-{DaP|%W$;cE0I>P$+Qzia@@}oBraT48xgI&yE<^{Qo7urs4~7|2 z4|FYppHay7n^ZSDjQ8I{k)9YG=g!n{o78QX!FVnlh${ga)>l@`cAPgCpVxc6%x0Ig z+?&{=oG^(B$QnW-d1omfOeAXI-40 z4^mM@Rb5KGK&oP$`v1YC_g?L_p!_7iPp`WDKKrj<|7QP5OeFu`%&|Z?_Sl^IS0sI2 zpb2o)^b!lW%RPRYHpnL&t9pZj?M~D0(LgSxILW7lTFUUyNWU?-qQ>GbBkvb~wDVLB z_OJw!1Zj=tQO8mDoEI^or{yVPMhaR;6N#hLO>CAo!m9qgF>;Jr@lIdWFR(e zzy5fhrxA&8v%H8dr@=0ppVYqEIn}}N)DM_STHj?k4%akeS~bD3Fd9n*xGCf?7a*pB zkR#MQTmuOt;6UX1d;hOT%{-2Bf!q~VmN%3#syjE=e>`imrE9fwWHV^L8zhXtTMNUs zhmg?fz_cnh4|*0)zp?>F7WMzX}9MVNFa6O6w-s%D;^I=K9HuS-` zDqxsVQXMXC7_D^(1Z`P2iRrHi#-46Txv|oFEHcYj)1Hu2*0Maq-0z##S8d|~%IeM6 zqfiq2_V>%bHB$+x)KU{;IhV<&)la4KL7pRjUUk@z^qn1QeN7e-qxU9`?2f%&Qhkf( zZ@n~UlNkhMK6QO^;4}?Ic%u3$XNMYK>6H19JmI+LA&RWT#K_Zu`tn!sX({L?6NH)Y~(g$C@|zPgxNv>BC(IqIwK3pF4B%P z^2tRy$E=r~TSb>&o$DS&9H zkN^JKVjSS`hrrB17<@6?u?lw_U$2l2W#@Em+ovfniYlRej2Z@Ry|{Uq#Z)CAm$zfh zb7MYYG7$@*PcW|nbdmQ}+e0S11wIp&DaxQ{4O&;t(T~>np@F>8-tl1)%sY^RR^NiB ze(u}6fdv1^>m=V$6A99>dr^lO_>P=izD1Ia+-9r-M>+OZbQg#M0%Phv=>I;KKmO9EI(x({Og&2M9}}Ft5fyO4cl#5oUIneTm_yF z$DYb@@*HMVKYLd?ymhurd3C!oUA)$MG8qC~OrxGb9+fKQPkd+GP%xj4K19+JLGQ^7 za?$Xs%(C~2I{&B(??<^nenwIcd^U5fn`*Ht`45@wpXl$RA5U7CpDWeIxv=YyN%xcNDFRK)W4s{=paI_N+N zQ8*{RKXxpmcdudobAjfxs?yDYy!HdOZlCRH`L$ZMskxCN(nTBdA-L&3kpNao%83!g zLgL5A5vTl_OsSj?=hMI&>!<6c=RgfGX`vLSLJn(&^M`Vg(uw1&%2-o^Ey%KH7482B zj%2v4FK(nJqf9!sA*@_96*nO!NNYzBs}fMuS(kp}CD{7D{6X0hXH#;^x9YzcC2O>O zYj~aph4oab;PdBaME?YL{Ip))RLg-s?5~)8VaJ$yNr{6(3}x<2A??H#$nJO1chy{% zfU><6dVD+yFIkJ-()){;t2)Z6D49IjI1(LgwJ9Rs*)ElWSX_K;OF~H%#$7F9hsZ+S zpj1l{DBfC#x7sVM7@^_lxE%T0Lu;`URk3h-ybOB+Wv5v^#`iaICx1VwXs@P!gwEI@8zB2lCY+<#Qbs?n$I*xR}acs zYRjDzYmKB|si+jV75uO!Q=jz;Wa4-E;)&EhO&(AABP91yU+bUba52u*?piE<_)y_| z&}!&FhJ;_~q8HRl6^ACF=3KGq>2$aS={nZEUto|uGqs()Pi5B?D?nXyKh9=r4iUx&u3QtRM5=c~DXYV4Ju9~AO8>C#GqAsK% zgDY+(+aEQ<-HNJ-g!reXc_4a*-%+V(kN&yL^XUimXjprprRMhhJhWa7A0{34`+Xz$ z<7>E(=pz0&8}3##%Sp3aks`Al58mh#007KRTFkFEP zCs>%g=9=7`T+a0ZwF;4@OJsEcL$TL#8U$OiVx!`>u85Ps3id_Eak7nzzNYtK{YMq5 zBz-$$mY?_k8;EtjH#--DDRi9NLRkK1=z<+bRds3|aa|27Xcpdx-90U59Almlle3l3 zbUW7Yq5Jz#K-%y2i7xM~wadB*HO@~S#zu022cMqm&f8RVI)CHt;Qd|QUr>gvHh>Pyyo#Fk!`%anggR*I$gno&!S*HWeBfa|DJZmQkOewHGY@=6Z zA#6YJ1GL!NY^%VGTXERU*qtNOe%r3n@)*wB_aDV^oAJkLFnIsCd~GXn_R~h=I%(42 z<>|<#2Yk!;gleQc=Z_X%&hKNpii9+?kpr8Q_3OFWw{rFCl;SJDX({Hg(0jh^*kFYl zw#xuKsR!V>!p@eoZ26i8a(A*BtM7L>DzF?-bMV)BGA!SqzQri^R{cg|1HrZRv5}IH z4tX_&(eXDWjzmbyLu=*}N+eCL5_V|q*!{;I1}+0c;uFmIjUkhJXtrftT0Qrg6+Kd( z7vm5p^dNw+7`1EX$0^vGT|lcbXQoPfDYp%QFe`4;N;B(qxy2RKee=!(%xEi_RlOTy zd|tO>59mrATEi_|All z>L$yS(+HLApw%b?oAQ9%=mJwDmo|Yd8tt+3YY~`M-Z(dAz>o$Tlt2TOkRMUM&OT0{ zEL0z6&v1|xDwU0k{F6dcsCF)yi=farFCROI32ojT9Uq}#{jFcuU6=@!Ic$7V-;aY( zsrrkNN5j|$l^|X_Q~kWggSNn&S+K2Q8y28yO*#*=yuR?xr0>yL z+!~pqI4=ncYdlyLUw3^c<~eoQrVp}}Df5ZB5Ps;?#NEd%^a$U;Ca^aTJ95|rm=GTD zmIZeNXPB}dBt0{_@!{g>x1%lad!(l&(KK~cqA0b5LA{%Lw)l>+l)Z0ZmZH!(Z9Skx zxms{6wQ->4#Um(^^Z|j z+{1i_vxdwb4gIFYTif7qCU*brv8;JM7xB)PX_V(>x_|dRJ0PN6oV#A9=~t!^Xit?U z{ZkQ#jgZo?WcX=(x7gaVT&=#pZ|J8`Y?4lF%nbM4A*T`p3;x6J$3TD5k++VXB3>QLZD)8n-GQITnHq(jYpuH&tyyv5;T`I zL0Z^ZgFtg))@h5f)%K&>6Z5ca{7UD~%!Ad(G$^LoXMy|e)E>(f@+6vKB35t8okXA+ z%wZLnVqvI?In?#70F9@4=$?X%Orpo(FY%YlQXPhlDW44+ny#A|KS~xqEo|kNpFz+W zw&4Q(Bz~!r6-;mQ|NpOmj+OQQGk^C=9xna-(`@z=c!qvF^@ks(v!55gtk#;dk zoC2jH!D^%QNGGs;VtUr+1XpV$f&kPa;}jnbCRFjJ^R@1~1Aq%PtsJ&8tacc&>i3jJ zD}1Y?F(T(dJWW<`akVXz-t9K^Q8kO}_geRmOKL0kjy7Vx(`tUt6CPux{rmEE#M6ix zOB?_6VAw0}T%N{4!_YJWH{EJcad9R*8aFi!_^q`rSm?GQI*%zmAyudVHFrg4u}`<= zW1sBLR^YoMGg*o?jpHPu&rRzhYMVE5Jqb?cMUU!Qw@JRyH1)^qGxyzIHA247IX&CY zm=}(tfjJ+bJwv?9*TlvMCBSd!VK?E{wX4wn_Hk#?8mkyf!@)l}w z@=BLPj7Aj0YYQGd6FZv}$jOwRDj%0w0t@(Nox{{>kmG?R5uLL+An#Dr*@h++R=c8k|I3uqZP!`Vz zJFopP*E$+4j-QN9EP6$MRbN`V$%&JV>?S!Wv$Bk>)!bToM2^iPQ=*w<6S?oJ*7~~G zOVzKN@>L7beHo_*hZ=!`FJ+Y1S7Z=&dfBdAb-eMdM(OHjoRzV|Nq1FBbIOglGFnT{ zZLrufj#q2P2?+3mRbi;?axbJ%V2iWr=dbLca1tx7fFo-6%}rf8Ya|EK*w7|ULsBrr zD7m)5YNSHtd^1~~Pz6AsXc1?J9b(mN%awZ{K?tWZSBzJuMW{YvmG_iLVg#-eu3Y%w zo~DoUZcBhyo(qDw5#dq@Mu@TsTT=5%^$2wE#KXcuQuO6sh@us?2(EUo?BR;GNn*hX zO83n&muMv!0Zb~Jy8lOe!(_~*vs*X#?tjkH5+zTbarSu?t6Kx;g&KuveI*p_^5uxh5&CrDep?Nm4Ok^DE!o zjM0@HS+fXsHl+`24n=vj-(v*RLesvP#+t=gx!HK*(&z8cR-sjm) zs6~bl!pMC5>QR{3o9)VAS`i_9(JpcYj0q>)2=pQCp*VqOSc#-Cf`labmn;6QN`bxk z_ua7?yO;Mf@0Zb;<*I;O+Q0FTlP0#krki}gz1z^W@95*DlE`Wp(ki5CRsi?u$V*PA4T zAI)X{!*>?52StP{3rTRe=)d?(O*`^yUl?^HjahMkBaN5mVuE$9>>XnXz#TU5M1WdI ze=LPGm-~jx7<i=*428TzEc*w;8KPx7+PI zj{4hg+}~YeOw%Fu#(2Dbo5d3R$D11Eqj}=Rmvzmqx=WLo5|=~ z(5X`Knu-)ki7>4V4{5EAoP1-=XvtY6-H!*kCT%rsSwv;1<@qhC<{jkE%H4ENGE2t= z-%gL;-SZiDyuh=umEP|F2((&igjT+HAwZZW^(dO#tZCZru170&?L zyv)3Aj{rZ>eLasriwK&^^?`?^spbT-)6D+!_t36ON0W4pwjj`l{xvE@T`*z*V%Gws z{Z4DIaa~KD;OL)9nv%8;-Z)u`O>@%r(JOVr(MY8X-dccY_u@N&ZY_1xS+}`)TQ{?( z(_n3lWu2?2Ut{)z%65IZe*hiG1!>Xu9+>YBzLQZn>ULotn(VNafdmd%C}~1+pg7&e zp@hTB#AW+ZGN}~K>93Sb$3c!wDyy5VkEznU)kyH3%V5Jk!5c zJ{e#d6yo{5mZo0Zpwvf?RsyZF*TO9^z`vnSzEeI@=L#~IQ--67*6&jmIHO&!cHco8 zKT&b2eGWRG@aaX3992NhYVu{*dY>~hGymNRP8x93-P^9ssB0?$(qjj1hXiGl5Do}R zlt!NFwqE|aswc2JkA4K!Z}qepK=*lI9Fi8$v22+bEKTW?We0JEgIU_1D1qYnk}Dvk zW9&je#7fAN9q=7~$ON=zyoF74VM!V08M>1a_TZa`|0Acy0E#_L5Uhsc5eFX_W5ok! zYby4;gcvKZ0*kRYgFj!uaRI~FGjnZpw3d2Xs`u+|G^rjbSw$bmd)o*IMs}CO*V!9d z#N!}=MT58?QhunMoC;>7%E(XZFMul#5~2VRQ-AG)al`otWPDmcv99d$$0y>7vGU|k zkxj3I4O6~y$Kk-R=m;qoE=7X<|NG(UpqH6d$-6+~l;};B;NVuFK(}cD7(T?a{LH!0 zU`y6oWNx6rlnnJp#T)LA6j`p;e)fize}q*Es@WekAd{8*UGVx*)vVo6X#`GIF3WC@ z&MxQ?GhOKNc#TDk<@pn}ZC_^@l%9QKKL3H9$oPRq&h=OlXY;H?|L3;Mxr|&cO-%3Pn_SiYk>TO$#SPOj|eN z_zizs4Jw0+PkH80SAcO=Ri!{UoKux(y}hGeQLawQ5nVxOXBbUXI|Lza_EqyzSg)8m zw;jW-A}EvPx}M-T-J%vc9O4HZ^XQn731my-=WcBJf$LTB$}31u@?%37Nlvch?N5Hm zkC=8YKO01B#zwr4&Dg+RL*5Qok#&whgrpxa_CXmZ^=e2p6F633b%xg!nucIoBktcbqbZ7jR;QfMJ1QvpHDr!cy?qt%Xd4M0YODu*J#RFe)EY|r-fB}3t@ zNWY2(5JoW4sEGQfy{xfCwRaylKv=KSbRR_vfBUwX}CZ(bmOUm~zg`+;i^Zg7c3bfN`{xF7=?@6mH8ke&SH6dKMw<&0eQM ziz0)jM>eoE1PFS$QCXxUz1nUU6vN-^z={by>3+zK^-L;GCyT0UXm^c8syc2E$qU5` zGCfS&V(^8GXz^hR2~JmxS51remJhUYlB!vTCi6->REP|4BUh90|b%Qz>Ql%Mx2kU}6}sVNrOpP&6&tCqN>bMG%EgY+nWRl2gq#e=gf0{|r*K2QK{6 zj;r@nFNH0T^7jme9e37rO@{t~HINiroAJan#>s0W?6L8@bWl{}f4R&s;N&UdDex9> zfg>jEaqUHZl;ZxI+hH5Gjznz7y|B2rPNSC6TK&+ZXVQhr3>BAwuW*<8^92C!EVw!ue8Wnj8WhLHZX%821o|O z4#G0p_|DvXYP~sLU>V{axKFK0(;LhtgI1mH&Q*xgA~sRzX};I)!K?nlVy!)Isgh64 z4HSFW7wmDh|al-OYV^IO+I%b<| zF;`b!r@Zj;7+u{li3EZUvm;wU1@fMYCsFj(oo5^6+p%HO${l?x(?&(R&4VQn4QCQ* znIWDCVKzy8lB#tTWSQ=%Hfi(bj>TrSFy`tY+;&|#7_=v?$j;3meC1Wu|jOr zuSemP(h0$bJW@~oZb(#zhA@AO2#V#Zy3CPCAcEyl-L4Uk7q|ak9quJiaLVm0{ggL3 zy4m!-d9A`|g%%pt&1?OoHY0RWR;WEkYa6)qOM9ghU#WzT`9;;Rwn%2>RDZZAZVw1g z02(5f@)LyPdnnqc1HCsL(oGYsq0Fd$WyN=_9v;$`l!foDwYcJ3+BQV*1C23n-(D%a z%gf$Jr}g<^QmTs21r@>SG;>9DyJ_^kiIp+*2>i)!_~w0k>}~j6tY9U$^8PqF0c2x% zk0p$6-2wO%KIM1ol(!0c4=a_Tlye$b1d^z}Wks`EH>v$;st6k2?08?T)>VO@#pd7f zU7`Q!Gz1I{K9Z&2a8vCHR8wE>qfVz!SHISmgM>rP4P_{Hr%xQq>Uun$f(eJcy}s|f z2z&_NgYP@IlRnR67ggKbe&qN8^YW^_l3AOWNAe=g9n-g{D*DXf(x3F9lGZi)I;8=4H_N@Rb3oi2>|Mr>}Q}9$Y z6NzXQb_1ChP5^uLsOI3LuUQ#)qX^!9&Ab}yPxr|;7Xt3xmZ7|HOfOvz6p@^59be9; z^NRH|T$nBO2x;WVdwgKWp5e@rK8T>YDhU{*7=4vGFO)KG?~1fX25#kizvk(v@_DV) zxFU%7Or+QY`}*;eHmY3oH;ri4H|{Q zszicHV&rf2H~`AM{u3~IU{^h5M2kp^Ht&i6GzN)z`}hLfnaOWub!W3yzE2VhEL75@ zV&PB&kLWfEZf}+9C-V6++01Tu@pM1VI$^JF6U?VFjO}*Aj&cFx<(xYwfY~@KE-JaW zMFFYjT;B*D#zE(&h)@XV z>A0x~od&$sYMEp+8Phe+-EMZsViad@;4RsV%o5{ZjmQE^u>L|}Eh^qdTZv|>I$94d zrQa2_wea}hN@T)8 zi>gq1UQKMR`F7qD>g4FqM9%?tPg0s_WBdTD-oo(_&MXw}wa+qyCbBZb*d*Bn*a{K~ zJ3+a!j^3w5Oo8si8zW=<^X)rQ$FX7E6bEe?#E5kp`}@bKKgEi5MYJm??Wi#a;C1z* z$GVXpl&=d#kzKG2&f^54$-0f|9lBvuS$DO#>$}lq-R|uyFFR3Y-4nwS;&?NtF@p>Y zM8EdX3e`o0k(A53(3V1yz-t!cLyrFXAwR~r&z?dl($n0Jj)vsWwJP?%H3X+wj15JH z!ES%j^Az(ZnNJC^c6S8Apc`8CxDuY}+(R#mAX!RYN)bN8b@2=Mwa|YMbtz11rBp7j z>b(nU5P-BSMor5xadqImPqhbg{li7CW_sTJ3t`};Fc8YhREVjhqJ#}YB#g6GuW))5 zn1V?}4BG7y!Ru6`Ou4NNvDqQ-y=%T<>&)$qnVZF=*cr6jWlaCdDWR$(nmqU%A_oKG6Ow}0?}o?W)pw&ojP&CWFGP@ zzv?eJXt2Pmku(lyJ{XdAs^F5G6g@=KDWaw=j;|7j73l1#k_{gY*c6YnYfq*sIX#TZ zbfiZ!CP#=+TG5;ZqvnpHuHM#aDZ{`Gp9k9aem*=0HrEvN?K=8}fdl`9aBM^D}SM2trEC{%GQNSe}T=`y z(Kub$Nd~H7G?SeG>yB;yx**531~z09JVSK$q)ts0`?I2Rm|wa3aH(-vN9pK;uaX;; z1;{O*>fq2NeI5P`5Dn!o;61>y;F!*+I9_{|DRug`Ru1(7C)}cfBtFuL*B{1PJq+AcbZB{6019xbKQ(zbfKVh zq{i)_GI9#)U_4Q1-ELPznt#A!Cs^KwYMv@hC^r^pbG9mK=$mvcK%0I%5m8uyjk1mg zrs=u2#DOG?m=<;kRg?smkhK-^fJ1Cf0=@f%$r7q( zQ(fdW382Bzb*(pYUWsRe>J7ewtv>;Jv8cf@oheTVd!GqYe25n$^=)<`)P3#EuAds( z@hznu%AZgGVjdce)H7Q0zxBPYO~(?X>YcP7?Augt3T0)N`B1;6*BDMNP{5H@PJSpp z?ZJm~b?qdo+88K{s5?KhGMpVuiO-5#eCC^I9Da-kjdSnVpZQP6q-l~xt4mV@$H26* zf;KRM%sx%ePn%!bSS+t;;ss9ScA6oAa2ZO*f?k*-289o)O2P)&*Q*K*>V)#`_j-l) z?Zs=s|=3ee1vo*dU^L^;R_QgQsMFj*Me9mTeY28Rmxx(O)Cm++_Ck;)Hr(o_l%c>KP$j zos@3WiYbe6H7%#*4!cC-E?5I8oG*~0DtxXtM2C)R!YBe_x07pTdTA(@MpV_4>~wI>{_#a zHGZ_SSnPdK8%tfnp8i~C+tso#Zknb&oJe^d&|EI-E|sN=UG8mC{!V<#=ueD&w;`4h zx&E3*z@JSKTt(Nt8i1_M-w_tE`}O&F7qKeHbQ!!zP*$32(l5d^CD%>ti%<>`=;FMH z(KNBE(t7;9#U3Jutq03iO?$LM>($csO%z9C+xWAMT`kGmznv4!(a^^J+!g!Wv9-ZV zC!H}vTm7@$>phm9+wzI-Xl(0$mKBV#;8p}c>5fLifqF5+yC*_IN&>a0d)346NI;#) zXp60pwWhtahh!p!Z|Gp67U;ESES+Xm{u{E;p&6w?BsGMnyu{zj<^cTzwKkz}z~b>Z ze>5eknAOxsj=}7!ho=KuVaV0E5l@i;%uA8T!cgRe)-0m)5TX5yi=YwV3O-ax=)jES zs6rOZKddQoxcCT)=ZY*>ALqzLc89HuST#KGVTQsV;!qN;q?pn5-<<`30RzSuCX6KX zP$3#yoOax^F+Ux+U)f{On-QKl%`y>W{flk_kc4qg-Qk4zEp2&Wu(Gk@C`X=vglwhV z1Jf7nSaHPl;d>+WZW_!CviuVdVWNm)wD4@#mr4$z+NETA2sx!I){<$hBD=_=oX|5^J^=$X6dVXSNOA_r{w$Ss+$SS;(iLM;rVrwy1vj za9Qgro-WGQPWQ2OU(V`sjv28Z`-9DDEf6mn82;mV)X5d;k1rkd5&iIUdx{kl%y=Bn zW^I-)vUzSo_N0k%JWZ43&A%%)tczT`fs_O%X!akda$g{Md-giC_(SP=Cs}Y=+fdZM$6YYhaIt{m;gmUy1(6z zPmafVh*E5=e_$BLUngInvS!CxDou})jOt^n)-XA({>%*L@bdMuSka!$8-~0%lDFdi zDEQHXu;>#z{fRn$W-|`^M|Ej1oYl&OUv;S%&+76TNQb`Hqn`2{7Ur_ zp-L;FgWDrt>goA%%QQS@#Zx>zSIvz9`YC}jC~g_)Y&PAa%lKVgFql!zECMhR$0rj| z!f5P8<+>B|4#ga%)d}?vOHhCjDN%RIupEnK&LaBtK}@w7h9dZTNf=6IesZ!$Cj=T` zY}-At+}yd+Pugxig;IuLG>Lj#Kt6KeHM}OV9T)G7jgfYUi0GX|qHh7uj^(~X;%UMj z9RULZ1PBoK;H+pj7Hum|{1TW@Ck<~Q*sNjRx%_z6KqY>S*=ZMIGjcIyPY zvUP%vZ2hA!mEWlmac)tS|4A1yhyQxdMQlpsOT53cyUvp+-5TvDQT9F4aq^Ame2C?Y zA^M^4lN@QuuHO>w0ob?R0$yZGNC!E;Sn8=_izVbCMCVLzN1P|%*#Z17fWGO<+MGh- zB>y=8`*#>x=sY&Vb-xG^ba+P+{3l?7%y#=z(@Yaj18;r!>)UUsHXPGqup-n_R!gF0 zU*62COJOhMIR>gbNfF4BK+`->b)FZQlop18t;zD-*&f_d%$bu#iw75nr=9wqKTC}2 z3|8)XRG^khio>NKds{L_iC0eQicJM6p+Ym+Ky%9u2KwW}(+(obMW%ziB%G5C{hp{w z&r#V|8#x&3pv_CJ%D3canr%(M>)Si(exQ`_malZ~z_t?4;$}YeV>P}dw6Oti-jCc~ zh20Hev8_W|WLa0PI>lBjV>8_%eJSim*UDm2h-*kkjASm#tX>av_O5k1OwixU=U#bC z3Cw1uO6gWwMa{pfDvEZjK#wN}Z>wsHxf}wlefzDIz!r>0bA4-Uk(;y8!juV-(>v@_ zEr|hwF^A1gjTEn=_=4JkwOYa!2{9-kI!)SFuJJD#F$y$`(w}UQ{Bm*YJ7Oo6j+flB zzlS2ZJKn&x2a?MhB=AU$E2U$OlbBpwsk%!yw2431BbUEWj|eB4Z-s729bGje`(a|! z*Nyv$YtyPMn?A^`-$}x$DiJhobsH~UPb^}VRG4`jIxWR0OW18?bavGo6~m_E4Td#q^S8FQr-`VY0HH|2=QA%RUaDYN#|QLD z5c!i8D@EpdI3-r&c*rRrns373n50SY+i03BrX{kt797B9JvEzXlA3)0*a-qff|4 ziTYdwS@X-ROc&|@;_YQ+;QU8}WurpiGd(9>Jvhi;FSAGMF?@I1w zwlPgOz@2k@&h=uYQp)GDvQKO|-($$_g&!-?x3shK4<_f&AV>+<{`JmkMEAKV9dt9g zc^v-^{3_8K;Z9S+S(C=DpC_1iq}etpyE7hk2`(k=78hv_J<_nE>{<$F7d(MZi=4cR z*O~~6L0BYT3-Unv3p@J>EW>IKJN3_WGC5AmDCz@QC8tSDK_MUP0229NO!~Ba?=XD* zo&N_GUXIsYvL8;9dyF(!tt{KxBp;7fP<{tsi!xN!mDAjHz<}6%mU2jnF1uCL{5L!3Bpu!-h>Y6Wd|0q+o1U4Y z@80b0rO$Tn_AJcxvY_!X#R}1A-zsk%j$3Ill^|QbaZOYWVzQl@URCL#5d)ER!FEXh z$n`swYv~3DcldQ2W(X5Ji30XX>?$k#{I|6jvf+Y#;0;*3rdzt-QRc`E!pmQjj@35> zPLn^0gmcaa3x0&)rFEzAMVHT5n?4ea=d1a7U~>J--^@&ggYEggYG#ygmIek&)HS0Z zA6AS}ynTH&g-OlI2?W>MD)yQFX}MOZ;K zldwbJ;$uS_sAXc7Z#QzeMzmy9jol5!gLkc6T7m=C%4ouQY>z5u^1~k zy6HN0*JGY#i*Q7V&WB{)4I5#7s`k$P5^~X%}y3Kn;gsxq^fhgnnfz>Kt|s0!?%_i#J8INsd)&Dm?Qs4Nxzb6mXy?*xVuFz zp@^6Fot&b%0s(kkmkdR#!=Gy3F{kW3NqYB2SA$+B^e%S@@t{jHtYm?ww*1OPbg6pfFIA%u)oZ3K{Iu1t5Fy(G?X z&FhSqivC2_KJfPNjW*t-;-$V-TZJDOk9m8yHMh0wYZFVC(}>RnVxn3^*btTkdn@pk zpt3=ywNQUT1G3)P1)q2FD>$UYxdN0d&xiQg%&ZiTOROK(2GVee#ar;H1yT#-zNU^H z!<%;B)xcyRJc?TNblq$91f@rdE~+_#fNLJ?FSa`*`1VZ6ay(AGR%>5}Njan)Zj2-U z6Q2~dp=wI2b64H+^&jub=D;mUVf)CMY>$STuQt>CdFOXpT}yNkF_;_uyvlgT#W;#b z^bX}aOgpu|PbzG_)4uVU0(1cXV0$nd1~dQF=ZWjS;~cfjAk()+00owo&G1Yae#?d6c2k- zq5E`1oE(KAnM=V`322JyA|9SoIM*C5A~PgwXeq*lIS_kF0j8n1mVnz~i*NAQN66)C zC3G_7MxIk`n7S;BA;{1Kc;=m-Oxql=9WkDX6PASSSQXeHShSYgIW&eoS%bn`tpN&~ zMp)HM*2t&Q)CQK-(PZwIRw2(@kh?%&R(6+uJX4GLFkYX|Wz1li)|BZZv6LfTeI6Y6 zZg%Vv5bcp}kHS@BAXVy;8InU#Zc(NvF2Yk>F!iufS-YX*W$0#oy21rESe zS zoBLJ;KmWR40DbAJRlsWQ=B^8tgkTa{bQisUj08F^DXy7ru0BG8r@PC?qAQUh*!>9m zujpO0>bs@omhv>+x}%oO{j2rC_~e*%)N$$zr;C&*Yl%iN#1^G6X1OQVDzxW3xhLnt zJW9yB+Y6hdbZ^*bM|R9TJ=AZ7(r3R6tuMT_dKNf)8iA01l~-z?IX&k^V%T>{OeVLQ zS8(P$Ot2VBFmFFzrj2euX_L3k+5QNtAC73-U$2C{1{49zx{w=i;$M`N8n&xSuvmkyI2+T}TC!I)>tYTO-KwLEDDP!fA#U(XDIU9}6*RC5qwQdpYulG}ZXWrCl zI$aZ!|9TA5jV>PhbPbcV&9d`bO&%?BobuS+B*;xy`TFkZB_}Q`hi_3NUk<9~OR;w1 zo!^>bDuWXgE;?(KvEu7Am|_*d-niXy`7FX;1qQ7tD0vISRnYHC4$oz-w$;bV454F* z%wAqnU2PWL(fzE9tZB+yw8S%-i%vkQ?9~P?U2VB|iN(s8RsFDn+QJF=%gIRLWtc1R z{BHduBTHn+WaY`&Msi`plIprr$l4@l&s#FnV=sK%aodPa4UR{_+0lT177=|2m z*pk2qO;kj~X4uvAPM~oZ&h*Z=E+*oVwpfBZhd2EN)3pXUZa;K)zUY{Z6qBrWQDl>M zbQ+Bdw8Pu?R&3fE=X!&~Ej7iiJaUB4_{SX^s{WudQ4-M8Gw@nIG0T(%ul1$EtyFf z-um{g{^a|g6~19RAH3aM;^OV3CUC8CoC;%2 zb#^R^!ogbT$QonZmPUWn^`^l_C|Ph3;+z&&<7C4OM2X9d&TZ# zXzFGtonC$0L9VTd%qBF~SU)l!VljDt$=7m!Ycx4{d{c&?PwiEAbZC3;T@PKrpfe$V3^ zLb0t&j!kWv`@lNKK6VD&REI)W91w%N@xG=l9#f{<N{!Bs*l-zQxp$G^0MCoCW=%XN*@}BaX&Uda_U{8roAnca^I||-t zhXAry_-8bG)+0a8yG9^Dg0Kjhk4ZO)spX=Z&?JmMlXPVEM*d;%cdDD&YN$#0COi)n zK|Egu5p#NPpd3#xk(XcnTm9&QNUt~X>C2X8SOQ>G&Hj7ib87BiYhUPm$^4VaPv)_m zb0q&_`PAR6Z~PUElKSs^T@Ub!C;lK$>te18+_6VBl&43jm`q1c@9?bwhe(z&UIKK6 z(L|}TI7eqCHLf_Qh~qt;K2gFWq?gGu_|9(mwd+1dhQp3=9H=z%Vp6U#>S> z%z8PWO{b96Q0Q#7K=uv=?0lxsEoA1q@qy9w=(Pzd9SWcjm)?<4(0p*|ojikJ8R{nr z=emXG8vk0mh(cxi8Hqz7Y$UlIVMee4$N({pz%_Ji+ zoQ1=teb5wVIsk}N1(L~c>paNm0LuDePgf&hzS#_BA9d1G*~X+H0SrSC`Wq_M#2(!! zJkJvyR*oQ#W<2W{^W3D_Idk6eXQ`S6mgoqC&uEG$IgpTfa&l+t_B^f}j^FJv$8+^L0w-tzx@BUh*Tj_*jdOk7=t_HENtfBsaCR2|-O zXqa~r6irL2h7N);oNkeRDv=yBpB#z5gIUImlnrD;Fo+czbbUG`U}A%Fb^fycqf((9 zUK*q9p2Ffq(9%7W30K$VyCy?(=IPu%;0??O0nN`&<%f==kE+$3k~2}Tk>S-H(=?O| zTf#G5ysib@DR!SVKgOO$dzcZW2(rz25K!Psx)yH-yhpr*(Ybgn7QnB|uIc-qnCpQ@ z9Dn;veDvq;rTDw^cVBM)>>EbB9eU@S{e!W7ZfzXG_JpBI4+qHiyI#^&V8G5U)z3IK z`hre(f@L@t2eAyvd`*StklD7nD8RVsr(4oth9Eux$cG)px|}<9+Z^;4lYc$)Jo3rb z|M?YsYC=jT!NSphlnuVp`KjM*$aK>OdjNS;F8A4goLB3(6PzNbgpZdXEnknEBBW&_ z?;%5{|I4Aesi(9^_8^d)On5bCz?50-$9Z=%GiorTb|6nu|hc zp8_0}(%vZkjV?V7H8OoblRZKSI^3j|**3DdBi15}UFhg+%Bi%|$3{0|E6l^1$m@mM zW}6QZa4q2yf_;YN+2i4AnrhFVBQF{kdS{x6QHD{-87B{bI+wt*Qu{ps_T~J&qdO8{ zcB1|aYKfJJvsZoULJZn`GE@OK-x4vrXDC=C zxW-%fHMAGY(oShX9h*?WvB}YpeLE)B0%=C=&x(a3#4pJ6y$SU-S0Z-DUlT~lvPTMx zfBDmJ*gC%NN~QORJ&8(;2;rOLbYHmqP%-HvYD~Se)pv;nw=NfUH$zIGOVtSGL?={G4F(*zakd;+!`FIn5MyA{ z_;1#ZYg>P-1ohcu>6`;lCJ=I;b5-4cnWJ@>$NXU)?16eX(zoPPc9OZLR$GgXBCZ3# z!i%MpH_#SsOmxKa#pf-MM(O!a0~DoVl@1Eg z<#?Xzp;^lG_LrdM>3H_Cq{$yk=fNGKYs(@3fC6r^^r7gwD$p%x>E)%6mj|k zt^um6n8eyuT!js9KL}<4sh=jl7*k=FN>ej}HH8Lbh6m)x zXht_ox3uNScgw_4lw$(GUJ2uf@x(a5EkE_h|DghksldK#c}M3H&8c3|w9gm1pJ)m9 z)&+(N_Z6)nf&ffVTY)GEc*okTWON(a2|uR8X6fkQ{n zIPf=#vG_^14atJ~2zprf@#GjH|EY%+qY+%!hYYJxo=Uh)CrGjNc}gBKfQr}`ldGp; zS8SbO6z?!~0r|U-C1mqR&Rk7&p8oPq;dZ;-F>Lo;C>81FFPir#OjVoNpdlNlKQwWo zy}d^}{5;9Z$1eQuX2dxEi@(Fw65H5wkWI+ax^%2(`?l;(5-t(LmIUNbLa3;>r-Ta} zkNulGe7E&30$kJo+;^bt6}fE&7@N57P~^N*K6gJK)T2g6w!3L!vv$4Q0hDS~h!3@V zuf6@R?w&4I4!R@%bnD8;OcYHeH5#(IGf0;91^+PjYX{Mk3BUgIK&jpV0$a1S7XWIm z10!RxANYpJN;+1Q0D3ZBV zX$MIIn3QBOa{Y3tn=C9s!b zzREQMhtMVvoQr`;)GdaVgbO5ek%1O%0*WN50i<;YZie!R`AzWFhMp1wG=QR(Pz!H% z#AWfV${z<_{vwgD{Hx7uL4cBmzw!S;WW_(UPjnHX8^d3f&`RvL!F~kRVGUNlyf(z2 zR9=`>g(*J@yEXVXtMhC2DS0~irFk}E&a{4I*nFQjQT01xAD+2kg1l&pN{`Z$G7x9c zYokh6S@#8a{orl1hLejXSpPf0XN3kj^TU0|x4Rm?@a(4nd;9O+{*9KCCm#R9dr;)O z3(iCrOJhrzH9&04wdF=W0;RB)PQd^ggKsC^?i6qwEIk)_1EN;4)UP97-eLoE`66o%6OdM_H$0e01rdcoxD?@%{ zvQt2T805ptSpz0yl0Y_rSZ5pB$E$zWQOy6vr|1do8&Oo#Cbm`|HkUp&1iELkM(U% zzx{IZ!iZmr`uyei;!K`dL4fq+*Bv_(*U(7_I0i(Wg19`Q5Y5xZv#_y;&q-+*6E3La z)cS^bPa6Yb2n7&Typi8v*!%zOjrYHL;bCeUMPK|AZT`^TwD4~K?jW#)KVl6;S6tKI zo7l(*J)x8cn==pdF;4EB%VLZ*dU*HdG^X^EAwQzR#(GtKg*~X0aAiMDl}loom|FRJ zan0!@WjwMd#uaP8ACS08#+i2EN01@R@SIbIwGf5v8RNe}P%z%)9ib^Ri6YeZCx6=> z+A_t;WIWutajLENd#d#CdHbd**LEcF&Q1QN*G7E)J8qjPzwwPv_fCwCjtm7WFYo0Y zo46+SC&@UrWa`La6K>EY!Oc9|EgpJT;poVndQ`(Vj@f(g!RDH~m}5f8>4Jx)%CB~_ za%rK|Ar4Ts*ke3 zTzumD8?~f9ZnObfKA5<2g(S}R)^v2l_1#91dYi;?ZQmOk~bqOl!%1z^=0v1|QfW~$9 zj>xv*#NsoA_=s+Cdgg^^UI*#B=&&~!PYt6|qtUFGCJK^5r+ctwvyW^0!zm)d_&~4x z>L@?6R!Hai*XW&bqQ~ji%>$c6Jf2JnaV4_?IrhEBmX15o zV?)1dLxs9I2(=|2Qg2W$k_=mY=Dvs@VQ7|%jgTE-j60MHI3&vp^5mVVoIpbz>20|1 zp+`NIeR-@k&%K?A~g+>&P2+3F2NJoe~#ISQS z`gUFae~R!(dgeFVvBKx$vrvSwoV{|ZcHy3Ka`VVx3m|vH@V8mzZ7(}=NN?4+mxuLGz{^R7u{oFx;CVD=q zcyZ|qJ(-}-_p~qml_hzRP}@L^5O)4pu?>|R$NU`I= zrn=-RJPG#*2(^~V_*-g=L{;*JPT}TQPBO|hUu zbJ=CSoL3|=+Y~E+g6IQINOW;z&PU$Qr5vya9J|*>`3SO!3?1p_(f#AMj^3XChjrcY zzGv6Hl|!MAU~y_U+PP$G8#l@iLh}g&Q)sLf0c6Zw++re4L8)R@@i3a_a& zez(gaM(=-QDvE`Id~=6|rZQTtYpZ&L{GIY03|ipk79 zC&UjmmvpsN%)5)xfUbuX1x!vd^Z&Js0*ffU+}pJx2FT-NR=-Br$AMe-b$Mzp=s1qh zCE4?>$nNFp9T&+xC-PVDpEoRjs9I2Yn`*wKEx%d;EGL&wX4e1Zc7N#PB{4Ytp!}gp zdb0VEy|mGub*QtbbaE@}wuf8J?f;%380Y{(%X|pHOJVWOCR{c7q0GFuU$f8n)q~Vx zQLS%&l-^WUY}oBxVD{f?NYSRO-rW9 zVJjNDEp7(8#Cd-LbnNYb#!2JuWIURkZW4f-4|D1Bf_J99$oV_4Dz_*M060hq2u7;p zzZMZ8MJW>DKc1b`N0~czx7D3X8Z(B~Bz zf#O6bGHR^Mf;H#f{VZ-yZWZWnwJqV_sH_~ZBy5cT3FN8?F$}wgo$OJgE?2T%cg*d3 zH$T6!t!?T_9KAkZh9jpl;SProV-WLG{1%(S;+*4GfOAo}YXtW!un| zA!fGkr(c`MoD>X-IZn3i4=i%)I~JdDM8(XY86@bVuHUebmZVw5upGIo+pn5|LGTrk@8p-PKegRGi1PavvHrPD&xpzZ z#DcxdcuP5vC6IZk{(H|N^vD<`eQ?0n*1F9miABhf_x>;kAI;rUk=q)~J~X6( zyS6;%A75H}u@FW5lV8*arZ~Dk8z&EQS9sO>H;7ySt*|MhiUb0bQa!&Sh2uj;>Zj$@ zRLC}7mkchJYg5@z?x~K}3J^L0 z`qxpC(xr1*#TJ?*V$<|`G&R$|)pxC;+>KT%OYT+L+h|c*?VdOzXj%aQ&a`42A}^aJ(ZsUKvD6R*@d={8M!J>bLpM_H0{z1|U=> z7Ah*X9dV)BPJtijDk$ZO+*_WLxZ63dD`i<9?3$C&Hi`Br9i83tj_zOM)ZJg=tP`TWlQ+k{feXZ2rur@E43?VHzisrKSIXl*d& z_%>~-=rv=6b{j5R&Eo+aS)gZ2gVCc$d-PFl4`gUI=X~1|KJOg(={TYzkJ7;ix@K{f zw@oAR8c|66*^oJ{65?nHHkdbA-DdrErSFz#rC2vDVx)%H(6Z5f^tyl&lE|LSQ#(j5 zC*^M3{ltd1cVW1VeX0IrVG$0Wjg>V)Yi+De>Pt;FBn(v!$4Y*E1lRCwPdJ2f7cgL) z7s>g2_4>v(Ez`)?N8}L!dsBzKSQ8%Q+wrCB5#a`UUdO-q?OmI-ZnK`((sy693fp%b z>7}XIfUD7-e667%F$CDgb^9Vkb3C&<<4*y_2pmiE0vJX{zN1pf(Mm$_78GQGpwCX7 zbBb+Qd@I6NvZvHd(-PV1AztO-4sUpZuvd+QRzrAK*%n?1wzRwP-8qbbZ{#DurRzqX zED`VKG0xXrLvT|0uq#Xdj?!vcmod!`;CBU>Q@QiHh#XlpbYNprcXt{7`{=<;xEN|Q z45mYOJB>0l&G`L+U@+uj;Lj*Bb%T;o$P4p;4C**8z@;qi9We@s1VTKQK4SuY8kvvS zlI$sU*L6hpdKg;ylSiOGngIZT06%y{K=Dl=D6f@7lcW~Q&PN!U>?w7QV+GY5Hgt2N zZF5|&G%-x!AHCw+3N?V7RXsdi+=gc|bPEY5~{Q~(G}U8+rswYJ+9IZM3J&`HkyeE z$rc-~Ga$(5W&U%;FrbLtf#Y1AiXfi|R$*)C(4rclg{ORK*+e3M+M`6bZ3)Cijw7Vw zgo|~-y`tjj%l_O35;ao~VCeM|>F}szGqe#f49nJ>9Rvr0q=n%14NT4e86B=sBJcK~*IO3KG*6I+-L_2ai{Mp$t75e7jRjDdIbP9LA%q4XC!IbG)# z`Ir!IDgNZx_ToF2w$`#MwYV@UZ=#{m%82&Ym-p?+dH7dT8ekg&)RqbuJN@~CC%YTt z(|%P>7x26T?2Cf?FPz^M4!XjmE}`^5!2}d#S%JT~~oy$*%}m z1R{&EuH(=;6SU5tRFcI-<#!70kff@hKxMbH<~E|#0SbHo%nk^LF=tYS2s~;0G;2L3(Hp1l$Tl}g8JTq}I*w#8WyW>8IJJDr;Mf`tWAr zfUOjN`HjZLjSdq36%o>dwI^|+SnnIr7D#C=Q#sxo=#U|L*r@1GcQ>Yk93k3J#6vO& zb{kU2i>C{)G6bJ1kW|1vQ1>B%DCWRLh9KuJM&@67nkJ|^%Wx@%KyqJ+zyL&OL>m@s z$JWcn>4usmVnOIX?tgN%pgK1yo&~s%9lB9txoUWb5w{u}wLMtSL!arm96C^4HFu8H z7hw5zqMKi}b`0_41tL0BWMTz@+i-Z=uXLQa01X17Y?efbX4${T>2G?1ASW-C^T%4G zeN<0bw`!z*x?y!=6sRxx&HRn60YSSu7MMM)w`wUW-qDM8Clnt;n+qN;pQJ0)DX?NcApTv3chN0d-V z$;v%>2Hg<8deCgPgPtOOUo2WWQD{6^pYc zA^Ny9ZrzPh>qpFWSb9(I!Tqn~QSW3XGZy>GCxG_~ES#%`7gC6HpvBH+3u?V8sK5V~ zKF2;)QB|`9!Evrw<3+|0%4;7m1}yf1Wm*=T)F9d`nJ47Ay&#m=g2GYwG}2PvIO>7> zD=d6tJXw{@s3vuuzT=;S91$)O@Hzmmh~19sIPj4MQ`rhxj%88lyY2zX@8DPP2?B=< z3<5sD?>$3IU`+tW$;K@9TC;SZGo(q*4TBIivdz&CYF>DzSFbxo0Nu9_n*tiR5NZOE zoCFjKax%a%T4P(?sJm&hg%o8mgYrpQ=ldxP6(hOcgn=2_3W|t$bRx}IMg>C~1R?4Y z9c$~YGRx-KmERTmwv1B&cWsGZJERy}MFyiI<9(%4U38zGxJ7oj)PnRR_KS@h^E20* z5kz@VkbH8@wx(8%wbsyE^g(^Sg_XQ?H2LB$*7Vk!ZJj;Oe)ayP$uvARBeyzH^q|gV z*IGHfP;j4#VAJ^604T^;31?Q&-> ztlhXRy`+YS-F)L4mxb#qD*WQC*KP_64(O;Hb3bCq2*2B%Xdr+Jr4yqSB}fJ+N(P-w z6IimiP{ZHhS5WW9br|p7RimnnF4=NlmJ8rJCdDiG|Bw6LIZfDxHUeVB)250>Ntqo2 zEHFWXf5DR_wY$78`p~0dC1aH-*IjW`x@O3Q_oA(ZPzO!nY(v3I*Q>h)eQqnSxCRmspD>GA+mgtIi^>oWSB|&hGnm0l0&q$;f$1ZL)L9TLH9j;Oj%B>XLUVs3%v&0d zMZt?LN=1^Dbw5>+Dy9?@P$cayu=}ZRyErKad>*dF`ka0UK%8R;s;cg$ESiHjvj8oU zSB51ht5gU}f>?D~^DEHg%Zg>p%>;Yv@G1O;gHl{hXVd9oHeXiYA)~L5gtAmBZJY?Y zCH`y|NebCtP=crxX)iQOh^K}O3_6^n$;TW^lb~r6vm9>z4z>t0Ibc_twse7}Oa;** zb8z4Po$zBeY4K?PVgh6D^m?!<;^yYN?h;&{U-syE{MpDF(x;JLlBVCIz5XZNJ{mWR zhc6AOHEh+AadnDidNl=dyG9YNh-lpp1cz@^3b(rM5Ma~?#dj!i4$EC2w}ngdG(q1B$2dnzrpa< z9aao0rBT^c49L)dO`a9%NCrGOPGq41I_7ZIp=KamWr;?{gvT?4^74GE4!X)2i4Onu zzSeikEn<9Qj7~lp8sM|*k9VKHY9B~M^PPA=mq$dTODz?2z(F$>aT2STLl2t3k-M{` z=@A{O8!aY{rKQ6u1$aP-b&9YgDGAJeaGEpiR?C~4%XO6MrOoXVr`2cQ1C=9Epzglu zlF-Rz@iX+R$M`5NeK|ygj5+<_L;mk<6-E|r0vQ;t`QDd(Zij>M`22pakhUlc-MIy> zC!tAT&lmKk16hL4@&;?Z-^cFU5P<|W`43CMpa*&)_m$!xiXaq zLUKyUbm3K44I5xS%y;tsgLaHcbAW{$+N34-O2P~^nzS~F$&=t*U2uvrZGsUlB&q2$ zlgpH=2u_bxCoadeHsa7k3*om<0+_X_rp|+@}ZAR~~m=giz@kC3RZUs$ZN6D{YKYt8DP zPSXz`nSc4^UO9bFpMD~LMXgGqgE_1KQXLleg;k3(O=1#qz2Y zDN=fgB-!(7xqR_ZU&XsPTJJDM$<>j;r+>(oR9*gD5yWxZ4upLKRhEbp`ODRl_nlzV zj4H9Ws1yD;wlDPh3;OGj?2r&{))1qmNoFZP0Tu*o2)yJ2YetIGTLi@#V2q6m=AnG3gl3Rk@`s2hl42xTaQR6ry-hNs9|f`?NU~r@o=k$D=A!I^ zeic2SK9oe<7Z1gOkjKkF;4|Me)jAG_s>o%Sq6q@$G}HOr$f2GEpAY+)zJX1oh|ts` zxim_VXZxMUIhA<-)W1=^H~!um|GqH2K^Y5d_0zls@UIr~)?+j!e-2=r0XFS{M`13| zt52esfQy6)7ttHF8G+Ji`L!mW(Id~EKYf%oSO6yk{w}b zGu8SE^Y=KyFHPXoM+r(%g;JC}!nDi;ktf+bVSTF}y^>8O&6x@xdHQ?_1x+8SyBLFq z`aU+bWf{4Gi@nXfu&!iU{1qHW3;x_*^%LI8oeuW&T`<&RfB_IYJw#MqYqWLXKMZtI z=l-qM%t@p^di|>3k0&ZE0-;%)8dr8>nI&E=XQ~<9w9d`zYDavG#Bvd@uRtcA1!S1`6g;@&!o~tlw?`Dhzf#bC#lLx znz^|Z7dfhzIkaS$T?e{{7wC5}+*(^!(KU6xVvZTp;}Wk7KvNXJqu>NaR*qy*li>wV>ZcpN72=QNR~^l?yH6GfqLKcj&RT}4KB&T%Lz zi=KFQ(6E{;;t59zmKxDO9(CRhrEI2@a8Bf#38N@GKB>*SV9oFso)a4&p?J zlfdGxI0$0YiW!5@@tua)WvhZT@ijv*;*nFP>;#}+zdtpb@|_!Oj4u6S_nMvwqHlMz ze#5slSj9Eg`3NnPu+GknO#;}|%4ajpA$3}aZlcX!R?tDJY}JiJ>%Ho|8IFuXvF7b( zE+w%gQDlbnY&Gc2LH$9wu{r53!Ym`$AqQaL6)I{y`MUj9RBd`xAzIPyU%~=%hS1Wj zhTLVVPLcSU0r%R_K0?5fOmPgUL78?LLEJx+((jr}VO_ApvkY6XWw@+hx}{nMv%n;p zs*!m9*Nh3ukb@u|BAm|8<_{X*-ThYc=T2YwyB7q01pVh`X%C?P(Rd5~{Tg|e?gb4$ z5#&b*nfdEaJMBLV9tyE29ZJcxrdmi9m{nk{bbM+za^K-gxR?X348lO7pc)PUcQH=m z&;D%?kOC{QJjo)C7A28}q<0TdZNl-ajWg-2_aJd=8|^&Vn<$!p(#mEJl?BJ?94GIW%k-LNHiS0ZYAG)Zp0=s1$3yS}foWgBZqSv36g zQKDN-2V&Dz&|kY%xunT;d^Ns#OU{37@KhWB~-YkgYC`ld+ zw3>?>BBs^E*UB79(^TS>>g3L1I+=)(i_>Zv0bxItXlkd@&l`=6uIHL!))?ICfS#dL zJrdlc_QTeAqzDcohn`?I={SbMCD|YV({GocXcT91;u5Xv>EO%D{^kxeEw`WEEBB5{ zB{6LpnG^MXH7Ul1t4Kz@OUR@#Dy)xEP6&gOy%<#MlaL%Su9T1(;+g9MvkKRCA7Ba< zL=3{l)DoQ0Tq}ZJaPeEd(rT z_=l-VoI}2hbE)Uoo-74f){2~-wop3_uQu(;b}MLVD(cf}`@lDJi<%(F7r*$>Y)V7T zF<4Zy-?;sU#2qNVH*_t*7~fTfku^<R%j{V8W}{7^AdddU1zL?-~k+CK$H3PTB=!*}b$>f8B~Y0O+XkV+3g-~7Z?D4G2^)dPjwp}&_nN5TQSrnk$yPbs z=jMev1vSmYN2F$>%)-@C$BG8jm*o$<*1_{tFwv+$oMUAq3T@xyo^l_LdwsBK6N(3T zJXTm^;Bh>@Wc-)1_8Tnd7zUc739=d4e5)Y0%>m0OjvuC`e)aXUbwOhXfpdviV^bqr zg61iC>`@lZTw7S_>eVsxbwel^!Rifj#gw!(Ed7~m%AB4v)Sr0AEoLsgCru+C3UC!n z*85iqE2HEl^#5g~bmR6=YlH3)^t994MbdVCmBsW_6Gjqi3JTK8+!P_Je}?Bk7$m5=+bGywnXG zjePGW@s+-!CXOSgNr9|Q;v^#_QBoD~AO+|tit>=MyrA*!cRRNs(^qeI&HFk@1}#mD zsm{~MR!&i-$(wJx0m@PDP=W`MS0PAqlFU8tZ`!M^-gG}lRkc$!XP-AO^GQS7m(lcJ zPA(uWH9bnjPEL8YC)@2^pgDoH-7k;9xmwh+*rBCotnxCNs=(Skxz#RqYu3Z!l3oe6 z-oYp1ME&l#Fh`wX_u<;+Fx0dV?S*;WBf3Hh^Grvvp?OP;n(8Z`$1q9ZdM?FF;a(cUI+H8#B`dlN?Tf(eS-I}74m~d^F z-X&`MQm(9R=?4ER2 z`P!O&Nu)%xE$98_k`JD>V9m6DxM-wa*rigM-oCRH3}T!jEW1>{+uvih*lZQN(JB;A zTJRSxaP;}TsAYep+0a;obM`FyC#5K)JCP`FbP=d@)R@4*_m_et;`YtyJyA(`ouW1F zf#=LC%?Em!P~lP&?MIp)hUdvHyw<>C<_%JV(1FbSpqMc+>l2Lg$^0<&l22$6CeWE_ zH>tx0c$U%qWSPtw3D$u1l3X9oG@zd*+e$&Vy3K8Tpti7#mb^|I&Mq%s4-VcAuCiKW z*J$>ZHRyC&seiP#9U|C-Wa>rG=QnEcXlZ-CYy(o=U{M%FA-lV!aMkj*u;(>D_B>O- zf$eS-pqD zOeX`;5z7(?Fv4IPW^4*{J&GpD7Zr=sP?rHGsxonz_7K|s3SWegamDkL{Vyg7p4d(Q; zLNBZLx-v8eOD1UWK$fRoBsiS9VaKAOjAY`bk2UuEDXT@%p4!2_N5`q<$GX)slV`%6 z&dt$*G4oBhCCZ~g+BX7?YCYR2Du!_RD@F5tt~ z>%k?#2Zhp(WBPfme(~ElifSxF zfxektWX?OOIf}=k$$g#4Stm;kBI!`k>Y9u@y^^1aJ){1iKNWL%e32A%H+y@2Sq#k5 z)?Uq|Uy(tG@|$4B=9Ee45{zSbBFGihW)bQWR2T-@A{IapYipnLD`D3iKj%%BCG9wz z==Q{v#Eo;^Y)R5sOW^`>0g zX&gE^{E)}8n+?E1yewf@4aRGMw9znNbjF%9Yh~uy5o^N!w~q}bEqwx8^Wv5RH$_Af zbO-*lT&qe6Gbyiyt$$PdHz!@eCbTQ3UVPV#YUYs>VHx zaiuRG)qTihVQ{NX4oekzKGYls(C0doKxj9OiTAdQ70HDt>f739_sqQOTtJ*V6K~6f z*y|c=M7#0gUWPE#8G>w4t{v3eL8@1+(2OF-cCh8S{0%`Z-S7_Kv>#%Vt?pl#6tv*evegVR*wylYTXd^FG70V80CV@1*eg zGyM`DhVPwS_TPWni5}#s{hVxl->DvHp(}Pu-2$~5sNczRe*%G?*aj}+8_(iH{F$g5 zkQsF4=}S36NLkbu_{SgGq=G^-!x1TCzhncP^g@uMV0g$1!XEihL+414G}|}#Juj&x z{w!=Z%=2x3V4wt+-Nwvu2mH&fM+u@Mr~S+`|8T&wslVP|e~e}w{d>@uxh4VNcDHe( zxFdz)8{AMc9iWTIk0NA)0fDs3P@N2L&O#np#^s4qxJ~E!rs_Yp2#l{J5tlCu>stid z)(yxH*vs#iHs%A6bHg5glu<&4<8iF6{9g?OYs-jA)^ z-V6_#SqCVFYtu9QEn69D>+--jZ`#C#8#)s8$UEybao8+;J|6Of_bLGc$WP2`-*(1X zW71L*34$D=evnSJ_CA@{HB+oq2*s`G;!LLg^Va(a3__fSmiE)EPcu*% zsTnyRx&iS@kZciHZ>`;_!^foaOU~}kB?(JO_LhX+l(}-UygIoe+jmcbeR`<{d2&y| zlXCRrZ=O6k!#&Z?6Yo7~jYl)6 zzQ2?H^6O_!PE!}9cT<`-XBRIPB*Ch)Rw)q|ANcAUA<(#JQ=mm-y1nhs)#$T#&}_g~ zx|RWE3Q$;3_>(h{NgLIlrk<_i$3|_wK_vgbPRAOAd8xpTR)^;?wi{i1Kj3cD^zA5| zt%PG{vJK}t3VZ51EBVYH8{DdNSg)6yI_tqhB+15g65GT_6OA670NP*y98^F}HdJ`0 zF)+?Uo%VXfGvKw%BMB7N!E9yVg)})jlOcH^s^CS#Ia12l)vBpF+LUKe_lOjqdA37u zl!Z_3+=a`M#I&%R(#f^aaV+ZPPL1BQ+tkJDr@gGo3SGzZ-~0DkNa!;;#*iB#SV~X8 zpinBMOrDJxmZ0l+vW5{M68cPz1Y=lAE*X!+VmjE?13YeKfv)2zTFrt;SBeF#YgGYv zbhS%0@O~S=xUOuN#jKFnP3p(ju#{Y#GgMUv>(9It)&#na$8at=h0cGl=RKaF3p0Oa z-5qHc@|siFf2|nOZJQo#bg+M^7*jbn6`E1cSw2KI#m}Aius|?p6tOXF{*z(gy8w%o zGWLI;<=^Dp*$P@st$9aC+|2V}3q@&$0-5QO*)G{?uilBkyd#G^KlMD=Vi$~{Gi8x8TY;|2iaQ}jsTD`J-+Y*5^Mid}JuxVDf`vuy;|;Z;{?hRdd;{L0%`E1X zsJ9Rr$XDG?~TZf)UX4^#H($Qd{zo;UIq?Kc|f>kt^cr3XXN zw!87b$!0>MeWA!R28z+Fz|1R95$7&t)J%6Gc{5QssFyu=jfs4 zZ*bRcOnWd0s3H_O}K*&$C6;(x=`T zAlxU1RhP2vabZlVODREdYrDmy<2V;03<&j1Ai+veT(j5qn$cg~gj>HS5=85%dc8Um zF3F-pKx|M#>kU-N=}pyzjApZN``oEg$y8w<-l2<{ENS8z2cw=Ao~n27pf<`;S&>5z zk)%BODEpn1ju|G^iEZSIbb(mC&P%H&Hn{WL^Uj9ghG5z| zP2F(LY)ojux7cpdru95rYPepN0x|POD);rC(=Lpk<*bIHehPiLHER@$g`F4{5cP!M zfU|5{*xg>b75vTV7Ir6{6DxjstWc@Rst)h}QYZZ3EYaEMGPXHVdmFZ$=u|Ir#Q#Sn ziONQh!)EaJ5vXgh%gA$vUq!40)Llc`A^uWMaHGU(hLKlz$&B-$H7n@76f;>KV(Gok z35zERvToN9isl+L2sq0>^CI0I%7qtsUT_)Cg6xcIw0hBu?d{g)Y`ZM#rY1`^H%6oW zsN3oH)239~%a;Zwu%P2Y==o1ce=FbZP1XM-)h)&}x-nAWdgvg!zPQ)A$8bkcq~Pea z4}AM;@>kAjoaLpUUy|NwPtGo0OIF{)W?y>eeA{kw!5Mu&<$KpHXD|P)VqQ_D@rbCJ zRB}K{@tc7NfFaHP^=o#Nn};(=SL-$52$G|TA0map(qYu z4lU^Lj>vPYgl7q>ND>7HbMg>MOpwHDtVTY)cJ;r!*R zXQK?-ZOb*Rl8K@(|K$`lwCStGCv!vBdzGr9^Iy}c4Gh0ruQ%vVmhz43wQ9oNU?Zsv z;AwJ2`%ir7TE3cIETbhoQ|0+*e)KoG>pxj2Bu_})T+4|nP2nS2OsqC@gqBdhw zxbAKF=Ls1|T+#o-(uOxoo|Q^5B9=4n(?5UO{}8{>)6+S_?#N*&l+8F|n**m!8Fu#Z z;I;bBV7)a%$_SF(#sY#4uYX7zr+pRUvesvz77bYGgj?9%Zs$V88q+Ooo;ZO0MIKC7 zl0}~3w6?oLd~mFYVTNt#CqKt&mc%w&3H;EzMxLz{@-^N#b~d^kS?SVSYqp&z-rI~s zB66=Fek88jxi~fB|07B4R_c{f6%9ij@9}=EXXa%W{F{34jqO}KZqnDz@T-uOkUlfG zYKRwj=-c2Xxr(M~+0=P55JgrKGOLM7JgrHbyFTv2oV(C~Ya=l>-b-HT`hib+-=j!t z?Q^yJh8Y?(69k^9z&5$UvNT!7>df#Af#6r(wds4~5V`J`nHTwHpVy1X^IXZ7` zXR{0udv-Apo0B34%B|f+cazN2Xb6zGr-s5Sc}GPod4rRXtYnZfiDCpLd9GIgCYP+3 zz7sL+IvZ}`j-DB^TaKrt%U+M~CubY)a)@ctS|qEDn>{&R_{t>?uk*L2O25{D9s&U}2_tbJyl1pWL$phdNVyF>RM^9XlsTfNWnh8?6N5boMUBWY?Yc;&gg3Me z_)6;{TZRnkB=?pt5bDrqPz%PDM6CEjqn`a52A9R^oz@n>)8<`m!U;%U@sp4I$HEPj&V5rj!4bB4H%eq0wm!cD5( zE=cja`)(c_*med2N9QhsA*Bk7@_T0ZygE+l%`E#5!I5d!mBUn0WJn%yZ4>p6RKa*w zU)sH)*Xdqqo}y{-YP9zifpdrI0mmrdk$PVmT^!qqW*8c2TUex4s*&V)pQ^>5LFXq; zGH~2ds2?`xZP_t#$>>fqYG-Q&tsV)gdLN1?5>#GC5Y zlOYL<(n7OFhVzG9cTh_U(!vSDr1LgzZbXhB#v5s++(6l?7U(gjgoW|IH@<*O^gt>@3kOMOBinxY>Hc)WWNdK~ zJrY7y%A*8InmqmC?982$mkZu`$1OR_YLw+DQXNMWH7~ffS>)E}QLL%zmdPS$IbT2# zk}PkEqyfRD>sQR-+M1i$i>Q`kBd=!Ga=_KTDfmr>7bRCO^p4)K`^;dbk6!lYIsPl6 z$m-}W@Zz;a@0sMR{_>4&%|O|xXN@ghQlff`MJ6^_#(=~14iyaR`r375!C$b^9@1WV zG6ZJ*N?cjla4#V|w2Fz(r|$t!Eb`pXt<^!1IQ?xfSU7t&Fa4qy!oP4l^&eUm-Y$pg zl}gSR8TW?**|ii@ZfkzG=4zEkd%4}n&4Bq4oR8wZ*BADMa2G?Q9Y4`LA1wP^OWDEK zEJ!)j239YTUE`*)Ei|z~@lJHthL&J?lGc_g#yLV*O$JF~v|!Zqkr9F^95v#cg{JY> z#})JZDlQNCzM9M|7nBqa~3x!(~-G4TG|d8_&WiUX(xKiu*~qK>tt*S zNQTskIoja3g}sOu51PqI;Aq5F>H2NK3p3rNaDn3=6hzhzROyaay7bWkMLn!CuvB8{ zng)(xW|4YVuOZ9+k@#ruJWrCpcE09Z*UdzwJ=Lq;EiTsNpG0MLaDnO6K-gHdMoOuR zIVsBy{R~>cP|);m9$af{UKioBp%gy8wik~-{-m?{2d8DTq2x?xzN-}HrdAelSi&%G zkPjce4?mtvR;ODTogq%CbLHiFDTyQ~@uWZN9U>FFVW)<_d&9UPf|FvW_5?`p+5swK*5l*N&s(0Is>!mWqJT9#oi2F41EFRt zD%u(iaP2KSM6#>@{n^GhB!(eLkT%CQmGU%qRqM&H1=r**W;{^b6$vhO_kl^!Dwij% zf3G(hrN+8>Sc8gVOdYgb51Y_LbJ6CDP|-YyQj{Dx3q=(;^lqw!p{`!F+-^utW5f^q zWa^N(e5Y|ZAm0@B*5q30+84#WmGI}?)|5V{z{TQ*-<~CTQ0P{x%!;12RzAH2j=I{R zyq!hB+(otqCn`DhwsFLKjyR1EpV*v`xbKyJ_(1e&6R)H=o0H+!&0&QSoyB{5VWGlk z)|OE~Bbvd{!j6>#OX#e3b({LtDq}KaI@r20pkDA!QIF#{jDDtSBZ1m^)Znnx8L8Nr)*DRaV?WRPu_tgkX;Qnw}NxJ zEHKnO=qaFRbH+0`EpmM-%^mwy!?J+Q^w;U*hYPQKr9mW z^>no~aS_{ucA)>~;w^DUzcvnJKH>nOV8#m;=)_K&T@MaI>#nJ0bvIm~{utiumbajl z7D{ZLqbh^$Z_JOhqv9mqiIhtxPt{iUW3^g6j{y?^MFH*mQ>3Z`g( zjQHSOIu*AN5g&=>^0)}40RfUn$YH~d69meG9&S&2iTaX;U2|^oNAtA5~nZyF~%)K*rw0Idib`z>fHd+1F$sBaqJd_0f+N%1T$}-e%qd!r$&GM)OBD+H`uBF z7Agf)H=Y->*;CY$-O(_X5H=Bqihacaf>~Q`vuP-ux;EI5deHSjDdQk3-p&qq6W)kD zSS!ux4atT2Nj=s9S1;x7SR;!{r6&dm-H8&Mh$WtCst8`%y-MOG6!J!R6lbX8@MeFG zLd%d^0}}JfVPHek3Zqu#=$h#`X3jo#@#6StE%G|tIQ`a@IB+KzYIZISc&bu;)qpG| zyID)!X=(34GQYdkMdH%%ZgO=u`(jQKgnh=L!VHQ)QFRzfJhLj~cccq}Gui?(oWJDN zPWp<*+d9m%Y`=HeqR|4K8|k-h&d?4(YC@j=oPXm;=_7{oE(=WpYo%z5MlHz6O!i53lv8eFS3X7V7tOzIc6xNH17n)NercUj#nBSCx~sp32H>* zaFpx5Q+uW-C>C0B&D3Av#_c&bAEuZVQVC4OBIr=L_?G0^s2F<%^XORVWC2Fs6-y$W?7Wankx!P)Nuq-`H+eYf)NfM2uB`i#DZD z4KGUOrn~Bpp=VpR)T@2ndK+THHof%GH&jqG{_7&=v^GkRE1H?+fbL4Juqx$hjcMAO z$Hj2Jxgp29nfeUl>68)K*w^BI^V2W|SriPXs$pq*Z}p+Z{H+cr>9YYN$nI)Aee|{z zk-&d=mEDcwk+ZGqxj%?NZsn!M^+l~4-?M{JWGCutlk_yW9hw-@6U6*hWz@Wj#D}{E$4V=N3`dJ< zJPP3f5QAj>ka9xI3P>51is`6EQ&kwrqp18yxbRU!ImsRcN{K%?mn7YFaEuNIDb0zJ zB1Bzt8A+Rm?!nto#dQfhONk6mKOJ9tt{LF!@-i-H{U#!zd8G37!9 zUv$wD=ddFhUpuza?~ui!&daRbV{5D4F{r8sXrU%Z2fCpl(KSEfJ0kX;4Uwwx6_Q2a z?mQyH^PRd?%~Yt$HMXjqu3MlsjPioRzx`PJQPZ4sVs76!&^)ZY5gAuU=f$-hk!i)$ z!W2~+yH0t9o)Oc^Txd8qzu8tiwFXT*FSmQtyw;X9V>paJ?W0|(v%cL)HOHv6tGYZu zRJ)o>OzwuV4kc0x_)zHzBOsg|e%1=7tNk+tZEz4KgT14|$gAbZ z8)`_hdxScWP%qyN+4>SuR7z5~Nrl1%lH!IRD@KTW^Gi0!H#od#0PEH^1y7^oJmL;4 z773aaYtl4pF>NpIiMhY$)~%Rx*Ro|aO^Lb4e0pAUyvtn4G<@8~c7|L^p}FAa%M1jOG<<%%km5~@Ikv(6#$mIR?c?;}C9r6c^j zM#FvdyIjy3x7|GuY~W*IS7Fi$v1n8dO0z&O`oNS@Ro&s~utmx+(>$R9h0(LHyf&VO zT^)vXt({V}*pXP#)<`+F$f_}zB^)t=ylu>S3)$HD$u=b4q~<2b2@w6zU~yj#LG?{E zuZ`rJ>d=hGZlBs%3&JUq@^gzu8h^lH8s+Y&t>w0=%HfPpO$(A;#VSCb|3!=2@4Jkk z(whP<)zLTAmP1k@F}$)r3lND3O#5VL8ix&9*wkz_3ol{LGzvO%?+wI3Pts|qg+owX z$4W4OA!@_5sKPc+hyl>i`p>Ni{I7__(;aj|K&lz+JAvFm`-Z;e)}#^ z-BeA-)#UR8=$2`l&AE%D!LVGGaf8ZG!*CGwwY>Sc{oqdYtE~9R9XF|@Ealo9VEIA& zLIe4@Fit!OAGs%)D(8-www2wY$o3Bq_Eq}gOZz?x$jrxX4gn7FTj{UTpZ$9VVFRnX zR%sy5_uY9@wH0qX^$OfN$P|DDTe9r%vaS>85H8u*VNU;!S;%)W@FhS94BuTv;QzRJ z(3T|{=2DlJttHhf7F+3|oPpFqL6-J^0D%j=JlA!up`YQ=x$Lc?+E2vA0v;LTF6hdJV#2B3<m9!ecqbe`GmoM!XAgT#!>@VGo}joRg51Y zgdC|%-zS)q1V!HeKt zQK)6sWDz~k?!vEs{km7-_SBo#ztKl8H1Co7F9v@_26msxrv3BZ)^wnq-Rw#;Xf#9P z;TwPXsL6-yr?tle2eHkLB$94Rf>d^*{2kK^Xt~h|* zR;_J=Nof?61QLL2OBLWJ)5e=Ih@Ij>|7_&S%?&XLuO=&`elvSPO*U<#3S22kIL>4$ z4fJ~9WN5~lv+3O%=%pvkT`65T9jqZo%+_WiHi;ftds16%*iA4(5z3v*6f39U0#_~% zADJVl3~1M$4xi)Xxn8Bp+DOaVCLsf=O#-UIHc@)rZ5TLrQOaPBeHCyj1c%v5(Fh!X z?pJO{y-IL+7=|W-rM18%BbOJ*2x~=#Z#|gn=ReQt zdf<7d;K|_)9}(;GTmCPFBuqGz2$u~{B_$?X|0L4%3Cd@b>{%P)g;+@@t#hX)67w3u z(xu!21>X{;5-&G~oA$-hlEIUDmMzqaabv8AKjYdz+C+_r z^kEnRP%09c8Bu~VXhDb_VVF7%ytBgO3f&&wVSNx?p5v^?aco=Gk#n{_)?r{GoED>e z**uJ#^?AUfupIZ{KHO?kR;YU@LZg`=SYo)U6&bc3zfSHuSd~>O7kJ+8b))NzhCXME zr%c^{@Z3;tacSB$X-m-6y-X(h*}Jh-YY?|e8eb731Rs2xJQ7$7da={7qls^khFM9` zN$-EhWNNIqBBiir%i8wH{H-qZ@2t4!8sY4B6ru+3zH7TvA$p4lx)%#ugDeIYcCat9 z8beb>|FBJH8_HZ7@W`@ec$C6wF}Q8jq{Dd<=IF|XM+<4;d#=5G#KVg-%>3S{oZv)k zThnx5DMB%|J{XH#72phOGDpq^(~_svYOO_k8m2RIw(fJ8a+>4#O=CNB+aRymJV8an z5d43CAm*dCzBOu!(AGIthv6Pt*tXRU8dw`rp*=ge!8m&^vez~Yg+z(C0aYAV`pL4Y zM4{o~0s-@b?vlON_5Uo6UKyPMkKs$cw|i&w7p~pb8nRg3J!1EUjWCN_#?lXih>s+J zBgPlrLMDy9lknL>R!usu#XNO6mrTe>U4@*`vix4~PY%p+z4?CC6EErsCS}YU%jw-N zJ|+I6h8rz)Dut2`oKI;H$V3l{Vm{v-L`rdb7TratB{Bqt>y9_I!ZJqr8B~aFCz`9V z+lOmvyWVdba1|)NS5>Z$D;LY)N3>Z{ldJjIN_`84=@g3(Z~ytHxrboZ2F9qMT_{+- zjBHdcE+w$+wU06q2a%5CXRTB*t3s*42NXgI7y5YbuF6zmbdsSZI^;QDg&{URn9DmD zQJwq6{WNLO87fOnq!8<7KJgcY^>`V;7!NVd)kf_?KEUy@vGMFyo>XkQhB(I%7>@*Z zBXY~?vFkL7YK|syW3Zz68Rd>KqjCLQ^gc0}GDagQpLFSt2UT7*6xJQ)<|T8`_W#i9 zTiM^V)%2yZrhOzC(*H{*kto$oK+mBzpGpEMj4Kz>?QlsmN89_^bow>o!E009>kx-( zo)s?0TJwD(1m-zOhCOIuO>;wiI(o|QtlJ4T9JU6n&`SAydr%~o5`&}Mc+$2X*ACrZ z?HkAlf#WsO4&$)bvmug^))e22C5l)04`WGUM7@ai0taUlWeX`5;fd(E-Yn>fxRyzU z{cN0ozyzD*P-SX4U6RZw<;&HX$V#QsoRI}U{4tYi!JpRQdxc2=IroD-bmAzoE@&el zzK$Q6Cs0%yBAo45gBLD|X%i*0QoF~^oHuz$S8zW4|5*rEGAu9Gr5O@NDpiA=(;mn( zjC}{xLq9ahEtQk7v9$*2fiHpOo)YL9p4j zCp7Jq=2adC&(;^3sk|h(okaTNmu8xzY)4=a@dsCSlMcsy2;5U--mH&8XTg&FjhO1*MEd2{!KlW zIol_WvyvnECsL_pS-&5`y~J3i(+5x2X?iNh`v-b>+`ni0l8`MTIg>op`d)FYs$*TF z^!NDZQaHv}jjhVr0LgkSpQpTbT>lpK>dt8CtsBO*h;NLutr;aZ48gYfNwANLMR7xA z>>OV9?Cx*SEK;^e&dVZ%t}VfSaE*+Qe-ha63a5K8bN$C^$(OA`y#UAwKO`^?G>($f^RenDJ__8wvo`hS4ne zTqGI|FIUW|FZOq(2Us@v_Ul^Q*o#9NOjpW7sYjkSY$FjZTDp_NL)|RD{5L77*OwF# zrk$0B$R#(5`4{cDiopDg!{mgK!tH5}k30{Gh51#eIh-BFW$fGT7&2IZj%NF*l)g}O z5-4&D&D>ES1lDZkwi?Tr)WM@+ju*W=`!;HT)nXUk#f$Itbw0!Isdc-}pwJsMVgcfv zHz&n*YwK#637Z6FA5Mae!OnVg5s)m`Jyf(VK8J>MWtnQ>`Rn$e8ctngv-jWyeH*nqObse5NH3TDB@za<3unx56u)=sGE3PFCEaF&)u-I3 zM$7X&6O-E0{C{+hUZdgpBb9hQk9ca_b+87mNrCydBk~QV`PtWqeOIPjr|nVrVtC1$ z+*fvfLS5!mPn*8Er`hdZs9qNLuBX_D*pe6`S*2!?5|o+7o~m_Gm^rWY^;HLGDrr1^ zw2+FRkc_P)3%%-&P7~CvJ~+T~m7JbRy+(ZEP9JN% zZdnhBWq^lmI2Xa=+UXU7(lELtL&5;Vx21sh$RD!^(e+i6foN0ei=t=xwuo8w`(Sey z;{ZraQG;zn1lto)ZkEfe8%JB1U_}IJidsKEw9BttfW-*h^bDo&M+a^=4FpA1-iT03 zXiEF`#2HJ7@gby%&r#WmNz{6+gT#4reQ)!i@S>uq3=r&3`O-EB`g~z5N{3nZAceTs z(TilkO(n?Elzf+)DxmpH5*Avxw&R+vWkZ&#!E4v_w(W*p6TUh)Z+1_lxiloMCv#@6 z{hY?r8RpV&71^Z%7I$k?$|Ogq9)`N>q8)^_h|~ zZnf(i&s-a{v{S=)eJ_Px2P>PEw=DxVVrgdut0k0J=5b;|nBW z+_#d|yU&!34=;EcZ2-(8{-t*GZ03?8b)?0G7!MNTc_emNlA>MDNQY|`V)(DAyQ`v+ z!pb2z2Z4++qMBo?dNiALFoqQvAB6%&nn5+Pc(Fgs;(?UqeOfsAWCssbZC8>In@F(; zpPH2Zy^U*~6QNOflxE?zX~EvZzw?B1-tiZutgH~en`K>Jgc$$-EpTZha#9~M(Nng< zWCi`BXSDqj!cPs+d3#_?&2si&tga@jG9S8eI`Sj7Wv*w21Y{dO!i{r%BZ*69@J#Gyc{RXJe7*4{OoMU_9JO zK68I1c-Aj7C*qg6=)_CjJ%MNQPK7pkJ_xKyI~X>rzHg5A*1j2Mv)WqmwsHY0nKt|o z$5d=2oZ&QfuDx^5&H**~cJd|581{*BRJ2Q|zRPhzRAF?VD_73bJn`+w+oyKiN$4^0 z*slsl{EECL?a*6dc!M!SJP9S-(!^$7-YwJv;}cZg5pq;-&t)2Sc&KSjXeuw7pYdYX z;(J0_fs43XyEn*2C;cw)!9l6ddXxwp|6-S&E6k=(m(B(9gZAQ-37RGUK;NsGGWxdA zGGYA${$cIpv}6TxG?L8Ml6p$x6)N>Mac_DpoRFDr@seKK>uk_okDQIV!CY24ai>hz z^eDa3oCEYIov9?}1lyGQlCD!tOodtks&AY+iCgdAMvD&@HP#Z&7;R)riFARFkz#Wp zwCJ>&l)QOIBA?u^s{t}|TP@O2z6g#f)`>G39d)tFj}C z87sLG+64)ukSk(>jpq?Hu(+fxfg?CKi?k)~a9r94c~{f%cj^U%eey_Pa6ZZHd>RDHy#=XDGc|HG@@XdbDKXuqFGHE9`x{`<7*J%t$j(e&sO&BwE~ER&Q^4u$(I z$h+SlK!+(b9|2Z)YWIt{>*7o?k{!;BH0B(^7q*^qRb~Ga1A&Q z!x-`4mEC(g;{OIFPHsld-U=2W*+EC4gUpMM47|8~FyKK-qr{v0#a_AAb>7P3Rqj+Jd8=>^R!XHv6BXEJ<}<{~)E<+x;PQxp$5w zyJD>BhO;l@IC9MtMJdVDY%gHER|Ek80NO?r!+8o>H#bV|=XB#n7Bd;3ItGEIKD1|q za*Y9_Msy&9^5RHc`{?f2U{+g4(SO@k_j2L)boc1uG?H*6iN}3=Ik_7>ETTnib79|6 z8vA_}TT5#si=gc^gGjk&Uo+KVm>kgDL)}KXJ7UUb44(;}(E=D82_w@ulSCk;uDuLs zyS)NwU7rPN7VbqQ4<2&Dr?-|B>{?!fq~LA=9fyS%@Uwaj@b88-3$ANjQqmW{Wl^Pt3PCe&T68+2&eDM8T%+8$-NH;Nl%fw6p^${1#A7A-kQzR)5&CPRBq znfDJURP3<)Pk@x32x>x`ts985Q`i>6Epo%5u7_n^6{DY@!;M!9P2{MphuYF4eLErK zEa{-}PUzv-Uf>TYY?$C;29M6k5<}_RhtGv04Y_H)=;7LrLl?5g=gmsBSGDs2Ie~kF zIvoaDrPE>v*zp=4KH%r9Y7}f8WY+onB2p&69s9W(OeoM5zxs4<8gWyv_Gs;sSwFY6 zmWE!y#|ms(OL=lH50G*l& z#}8A|e%Bw!JahfqhG`IXwgka^S z3vIjM-d}}ER4!!h&dO~m(5*=+avtn~`ML~La;WXf`hIg+>M{L2^`blWLU76-o|~J7 z;kU?%D?w{?%9wX+#nf!KpkpBUgNNiGqg3lS8M%ZYJ(2eJ7St%E)Na&x^pd>Vq1YGE zJ43zyWDZ=r;X|Q-%F4D>0l^T4*JS3t5*N)&LwjYO<+Rf&o;sAduD(R02>Y zDey`*Q%kgRYXF`q{m>FxKoGIxDfdqH%DmUYkM*!(hslrDMka`2PGZ8t;Y5WQQ9*3! z=)Imi%Zb68;kD`nmboP^EjBz_d_)^0F~};R6VuqFB5qn}Oi8di$6#q>w7I!}Q64=N z?W?Z@9RyGdMm<;KPO}o$N~N1XWiiGY#qIL_b?7{G?}O~Z>qH&-=Tr4+-x8tab7e7> z7p+l3s4t+3AHuBuiI zHlZy%M1)I~T_#SP^;M0)K0LV-t#Bim16xtip>M{3Nybp(eJb~1TVK2wGuBcu-M@R- zITcUs6V|F&)N6)ys?~rZf7VQUu^ab~s=fwA@D*pNfYpDut-TNCMqRR~>q8ik(LyX5 z-nP6a2-=R)J#_E=Ak(Kd=<>w>K%N?p%Kwt(yl2)N_It_e-%mEoaWfqYGxA_E&qcQl zwkIB1z5c+B{O}*kIy{jz@+jIV#e&M5vr?Yi_a^w{40BiU8jBS;VWc8jcoiI&$L9*3 zd8bfHM>p8vhEM%NyxkqTXXTlFt&WYVt3HE z6ge!Rq2b8;r*DYy=qYzQQl^y!GiIjvZb(1p=Vr;1MVbpRvJ)-ZnTJ*v7ym=085^=5 zeWt_JX;UASC-Yju60qi;=GEl&hf)J`x-7ur`6R>0*=X^rTn4R^as7=PwO5C~UCssn zpgP7QB8|p~hmYpIK*%w<4-0kV!JH-tSeT^KFp~PdZ-eCIfHLW1@*gh_8XH=B^lCoY z+^C&Lk^AQqs`S!teXbV_F=Y}ZVq-3cOG>GB*!a>6gTMGo<~-`XKnXO6OR}WvP=3L#0F? zoM&+kYjR5hI7bGaX>`y94|g~=QuH8fE(2o*I~HzJ4}XUpDiH!mAhZbZabuO)aAmIO~D7ig%6GR8rx9(lqN``F-K*9YjWeKiE^w?o26W~qLqrJ zN+JJ_>1Cy?o$ic|_L=ah`A+-aP27rK^#|fdbI{W^=KPw8zr3`I$Ou@X4;vvn{4o|l zz*hP9bT1PNO-`Ghq}VjA9y~_AC=_3-wVLywR;yVWgnN zmh00R(S&#`8z$q`BCOcJF6^|lafvR7I{S$w&Jw48$+Mr=QZwfl-ayT&`s_;q0`<(U zcl^?x37*-v;)#)K_(`>NQ174pY9Q0y>Ba8uDFFY55rtHO1BGXwn$AxRgG&qjlFjYi z#iOLVBi?iX!B#Oy%cN(dyzmj)t4n{sG9Nlf9vAQ2_Gs?;r`4bdY(?YV38Nr)70Fkj}ke>vLQ z`|a5B=bOD$W=K*IW%BI_D`@^dV9e1C6%EL=2BnguhaA@%C$VAux1E#N?MJAga>zdA z_KEZVQ=v<%(O0FcNVW9SkO~>->7K1is|1(KMXU!j@LemIWmq*BBoxhGE8aAAw03hT z)bDrZ1l7-A{5O8z1Ufe=BEy*9kBpaN58gr#?{gr6=uu5i z1D554wObk-0?CpdX)aFtIc&d(ZJ8HbYO|#zJW69^ruF3Rk*sPK|Np zT0HAOR(I=!b5jnNddqa1S{b0A*snD zWyenfWzT4LC89`vj}MOa6V~QA3G*if3aiC0zEY17Vk!L zF4yoKqi-=VO|0=qN2!`E7^9aacgTelrAUR78X(xvp0|)M(02sa)64r!W-wFN@&H9Z zy1&p7WTMI&x_Lxb-`9&A-ZCQz0Z|DchyxuRltefnfP80FUj4&S_U{!w@vyDn#23dW z=2PgT^w{9Yz~G7K@Z`f!K5}TdT57+Y#)2j_SI+NM#T6g_((c+<{CfF|0C2H%@-m?+ zygR#@Aeb;c-8-_s59a0Nru`{f7efc;dn|*bDQWaikByb0PB=5yg=epJm)cRe&$d^Pe=%UBgu!F>#~4zgo3L0p@~Q7{gTShM+c(P0kZ0b!m$GPeA8a$>rqVs3jdw<@JvDw!ZeFO`aSt+IA*OifMa ztX#wiJ@J6d&w;WxI~;a{Mj?w_4-Q#R!#IN(Qr6aJ3|0+=jm-<2iAFyGFeaS=@I!=^ zairk9{V=)qofFA8$02q&a~bC|BodX)B&t61_L3D$qQG5qy?X9ux>+vuUTB0rl4Te- zDcvCG!geM%U+F~LifNK*e<9vn?NVtic<5iqk@op@4L?;}Fi2Trx_{_&Hl>|(wK(*_ zVovxE+D{{0*Wi>`ZCAAKAAPoPMV;1O>Bvgl2&5}Fp@4;lzN^!+b_N`soo7Q(iO*jg z?Ji@WW5i(eCP3g6PHKBY0UXG1Nhga;Ix;i^GO_p5T*-Eh_onJ2(1XKQOQjV|LRqdT znMO@|1-YS_2OR<=qT%?eChv_xezlaav!s?a_i<>tx7g?gY%)ky+DyKUr(YAht3?&5 zF|=j6BPv$Zx$V*(Q2mw>{Nfj@Xy!^jOoJl-KRvdncY(@okDWx!b~3zTM%x$m)}RbS z<=A(iy+OZpA;q2x;*!AAGOx)!$l4nVfALETS8$=ny#qS0AuXpJ>up+XVy^Q2#uxmyD?8Ws2sq>UNZ)}Cxaxq{Q zRC1mbWW($q(!~dQQ>ho~%UOIh#IPS?|JJMWH@EwKca~)j<(T$9uyRPp%enfJm3Np8 z(E32C;-RO1IO(^F)!y7skS@=PKRdAGK*}x%jl#@h13a_Wos ztTKrLqP|?1$P-gkfm;(-0_uz*{+Z(P&MdW2B!qfbI6;NEm7LdCuLhyx(Fdi9Jm+R} z^ZTi^bHKyuSO>7@Od}>FxI*xG3I-cN2YPuI6GzlUdQqxr2L+t))0HvY^IF!#I{W03 zF#I9Kf>Rv&8;dsNTt4s{(TrsCm`#DJCj^;UAyG$;&ysoYryEMGT z+HxnV8vI;oE~o^y9oG31SIEVaHSD?1z$e%}BM8T~;sO@7F96`-0^lM1H#jC*J?}IC z+smM|x@^xo^6!HahK~YzXRFVn<*BG6 z0StW?`wvAuS-3n{K670EPW*-wgLKKL4BJG0dO6$n1MDWKx5?`>MOBI*ZbH~)G*Hq# zBUutd9Me2JfHyaY@$xhXc0^e(n|iT)ha(L^qC`g*PV^79u?%C=B4mtp3S-T;_2Lo{ z;p0pH6PcPt&RX*2#&t`%>w3R$Se)`38k^6eV&P5JCTe>SR(ze|xro=v1(U@e`nN;T zI^DvB5U(!P@^9Bzl~>25%6SZAG}0B)nkvZNJG+JXcZ4!c_2-2( z(5fQ+r_^j)sa|a&PC=6nSrePjOMffDQ5WQzI-6-CE?S9DZ&OmQuK@ixVJ_-@?IS*G zEc(QmJt$tsa8`Cnf&Z&pwk2J}=lSOU9i%pCDFjAkbl3BRH$qPeOsb?h$%Zxcy%CvF zi4a1-lR}B5f!1?bZkK~ZjPZ-^7-M}49Qu%HZsuk`R>x9|&S69#iHp6sKz)YCo_FcG zIdV-^;hY0z9jZYxi&452A=GYkycDGaXW>MxD2@`OdpuBHP)ysYe69V^=gHj8jjGg5 zVRt5DAZ8*Ivaj16rJup?T6ur+2yf)W<}wld?0 zB?tVR7dbz@B^(V7Dy@d^Q_FMIn3+kMC0mLo4qkV&M6?!+Zn7;4NC{Efd z+k3MAI5xW{3MaN5YBQX;Yj$FTl|Py7qFP01VJlHV@u+p#ML}Lrnwp8SC18u#T4RP7 zdXU%zG_zsa4+n@VlMkF5sK%R*V65le@Uy&p%1##>gTq+AxIgEI`RY*kQk6`|B<^_L z?!I!3MlHoC@2EO2? zEx~lVlO0FL#Ce+<2%zJ9={V@22}RSkC7D39UU&8~EO2}?S8m%e!+4eo_E{AK50>&OB)=iGff-G^V&ojyc^r_O}LrshlA|JwI(a=$dr2VvN2sR zp_d#Y_D~=(r$`?)6hb9y|G`+qnl%HD{0!sa$DQ}9Yo@aJY#JU|e|L!M?n>!4?#nGX zn|Jcv_JEi_&rC~}ctKsXh>yKt!)h~F?*4!u+W)R0l&PeAO@29pf<+#8-n)KwD7>Gu zp@sl5&K8e@E*gEY1h$#OtpxCf+l)GURwp-Yj@9H z;oZ^73uLc=d2UzUh@s2-tD1VV+iQM|qjjwH?cMP1$$`Ze2O;`d9=asoGLgH(b(Ts9 zSMG_LhzZ1g6n3IZr4%Dw{KBi3C*sCf4asAXD`>@-L_u-j+wHZu>)@SW7t=jnSsjia zyle5&zOvUARIIWe6g&K9-4}QzRm+oTJl4i(+)k7A(XqziJZavYekDZwEw#37T#xZJ zmO_r7eLp&DjBwSh0Qz|gPJ{GT@3@oXiNWr<<5jCfRX4vlWM^)e^!Ccw{`yn2Ye`z0 zCmx^lormD*NeRokH2CNHNbhugtgwlz$6^%_;H`!7CQ3;f@ zrYTv+_njlMYu4H)v}I(SONyWv{>I3yPCh;Tzg)yMf{E( z{Csx^kB`Xl8Uk73oB_-KKX^p0Anv3K`4LTk2EWu}+&PXr+ zXdg%~Wp%6FCFAVHT;-G~i3G-CbmN%t$Wvi^mNaw2Fc|6{25m&mMgO#q_V+|fMoFKa z9E4usCl`ArUON}ZO|#ISB=y=F%SdFky_ETtvCAJYSXmm%ESUa;cgq+<`uF6jmvUGK z`2Oh)F1msu#adH*AX+2p4ZOgShM@^tyKY%zs0qG8jX2Q}<0}sA-!~H4k*sDhrRuEG zFY0BoJUMP+aWZn!F>5}NMaf+>?vX)llJ2++>1Z~|sTo|_Q%2Mac_%a2>&dYTvumJp zzF1%sPm~1Fv|x-Lx1xO+LVTDte_|0Nh!dGY0@fN?{c&La3oxE-)%7q!CMCAc!a&Ij zCW?qBLS<~4ulJNg(NIxf#SC1uW*_()=|+@HlDVdpNQA~vDkpc)5Q1xxJY)Vi9l7kP zWDjDIx$kaKE?k0n9ea_pg&Z?O7MxsEJ8G;fl1}|q;Yc=FXhauKRPyp2jY2ZRUfe24 zyA}n9`gb6jGSBgDB}8~lS{MVP+l-)w;cy6?gRguW@yQVV8^8su;@2sUHfb)An z+phX_K4&lWJx!eJ_rgRC8lvJ-_jL#oVZKNiFKJ~cNYddB06zeyDY#^SiGH5*k}`@2 zM_VHM6Ee66iI{=QaW$SbsG+uUDMODJU5n5qkKEBV8mxPlVVG*04cxR$gIt#^e$;5b zri^?m)c5FO$)qKbfL`+JUKwab-yiZNCLqpL!RV5RSuD^96#S#PKEiqOCC2S4 z43|qc*G1AdP`uqb&`QUnt$|9K9v=un?rUz4D}SDfwrh<bix0$5RdN|ONlNmb5F8v6AW*_>?~J>)xF-eL~fOsDe-)_Of?EYHe)qT?jY z(wg`hMWZkAk=k5N;K z;q#aG(l05p_xItNK$UcMc#0K#no|Mi3=5u1I_YvY{9>193T)P7qX>g*k^Ij+qxKiIX89%9yiD%|Ru)(97H>>)K zbHB4PaVd7&q4H3-LW=ta=Z+A%o4&`9Q9ThQ>4m4xyBXcNt&Eb z%*>F3>pG(T+)&=f*d7StIoP0(p~FihEu&uIt188l!)&pb9cn3D))GJale8?G-fdI1 z?+XZMOIqwU*LS_}A0o20?)f-Hljl9%{UZ7aYfo6Nex}ca7M5$M;LR;^zi~{f*o;NE!=ne9O;lzGr`3J~gvV z>ucWhQ@#7j8eNR-$fc3^@pakN=7Q#jF_GBgdw8fIX)87mQm{1mdBAn|D_^itV1?+m8SW5BES zr?^&TX>Sm|JMi1jD(5nkW?k^eA2H^WS!Ag(LvPjGNc>~B+t)(l4T$6#xm?N;SuyY> zLM{tO#?~gHl_XC*+x@3!XmSP;Uwilbz1NjB|IH42p4}mfGapoep;!Kc-%U%B(X*|G z3O)iB;8D$GVFvRNc(VpwL1^n3~ZA)(}0KaA1NhnkbG zTYvqqgSh{`_E%4QD}5b|an+nbe(u4$tou((2*nC^BuE>bs8}%o)beaE|9lQ!gh9Ln z$&aj$wM_$7!4zdVpL(AC9@6C{B7HB>&TfpJ?HX-?a?OJRh63$DVe%Tqwd;MsXxc;8 zg#BzNrhNqn^0cphM1LGA<$B~yNIcCMN$)R~&^q`2bISWqujgTCJ9LP3sZB@P|-sr1P`n$7=o zP8_OlBK;|Md0|I}U~sz`QwtO$`<+rJYhwN;B{vZOimm_=qKrHt^7YENj~|}b>7Pu| z^Uj*fEqPF-D~50Vm3=Ta?II(2V^J1UH^~f=(&}=Ui&$IFzmXWxxVZ?Lbx1o?cQOz& zFp($k12u2+FS>b2?b+;*YNZ-)nz7z~9|rQ(R^%E|&B}^9Bx8Hb)!Zaz(FJz`e~k0y zSf>G1FXIjXks>hZq9j|c*W4ury#12bPl_s`B?ZE-{h@zReW%{1-5hnObKEfx!mERcr-j_*r6R+g$=fLm@h>Cl}Hz?`2Z` zm4Ip-gS8_i9!Cq}2c{`tvFyaIU!+~)NJmX3;t+Np1c(CWe)<6Do1baCtp6m4&HtH0 zu=8m{#Ct!V_z4{O=;nAaTx|eXn-Z`jEh(9Z1K2m>fGdGsF9JDEWU5|YA7b%42gnd! zbNubR{uxP;pZng=&g3lcKJ6dS=zb7Pm~9wrw0M3Vh-y<#VM8wxSqrNWq7=1|3`V5S zl#;nHHxP->Ye$130~WEB>SS__XJ3Z}4Mr6yRF8tzz|b`+(8K!F(ihfG*9&?W-v_N;2$s>%PXO9QMcT*IO)&MyAohdwm3gl4 z*#ZJpSMRnWxL~4uuAugDzAgu>d#X=K$010T zSNV_OX8wJ+O$@q1rpvSOy{uoIr(_iw5M`lXa5pIbmHmUPzk)Q`1eu z#EY|F5XIfUW%!<5&G02@n(Xpgjm17b7wW8MoC2O`R3WkuZ6AnpQ-_a z?jm$d5768=^+8V-0eEa4Y3klF_nG&z;MxC@;bb*bW1od?7*Ux&l*E4#|66H?2zJfb z6oOozvQCmcOD&2_3~9T-4Sd&gZMPSoEQAMnViOBd*rRoJs;re(=|B!x+am%*T(dk5 zHE=!4J4sHamQCJc;-4jKP82wvV?bqEPc7Xu2WN(}A>~$6$rg`N#@?|n4?e0BSF7=2 z+uTPD32{h2!&)>>=9UngWa!#j{CuJ zlQZl8-V2WcKpyjFbm7mYBfKvM2J_L$fpWr^Q#(EP(Yi9gl(nH(Ky%)8ZMS;Ry6el? z^{$?1#MA^g(IYV6wFhp8%%tLU-Kf=+Mwk?U*apT8HJe0L^xPL35E?i*VMsK)dHYga3h<DWq_!1-VgP#Qjln#v)TmMm-&d1{U4lo zaWa_2ELBiDBCw8@lnqNirO&q)|NGk$%xjdP%a!c ztt*v4Pl|E;qJv*fmF7IsfAy>GcHQ`a$TT!;5sYX}hxVqsb$I=G(3>iSc}wT@nis|g zs)g+m=D03Jd^%58mIO%oQ1VZxcyxhdAjphzI~o)bMz_(Dx6 z2x5YW5F$FU&d0^xriWOyxy(||MnttS167%s;50UYiX%|^EEQSghA*skhCd`<(bt?9 z`H(Uy_vyR}C00G*aD*lf+YjE}eSi1(qXjw8wwurHo~OOJ!e7R*eR(8v`2Fg>M-OJj ztC9FshhE{h>x-{VhQ!jdDXWb?>0G+g!#0ZP^b;%z^Y-lDuI^pg+H_>G$>Yfk@HY2k(7}WEf3p4ydoXr;yI&L-M-yVnZqYygeObP!CnBH4GJfye`X^A#< zVb^2L=JGC{O(wIvnyhB4g=IBUF*P#kJ9ljELham3?V_H%5e?0Jq%+WeH+fk&-ri1j z=f3b=moAW2(nVyXx%292f4X?;T?A#zsbvP^MlU^*8Wi&Vw z7JL)|WlSxEou9hP0@d-8SyqE;8m*!pk~PJ}Lb{X08Z>0;P>eYJRK+j0an0<|IwF4J$$NE?T1-H0^_}`|-DrA+r z`ZX4+8BG|L+DaG9Uf@Zt7)3H{=ITP{>YEf4D@1|FZ&Cp=9M+un{5yOJiq49peV=OZ zB>Hde0}J;+>CmYukkaU2|LB`mR0d9I%VH0VE`z}yyr_Rs=}d}gkQL+NG3Rkr{pKlY z{^~UZW&H_RrUkBGHuT)gcq;L5!4CJU(g3y-srj^VX`@cdG5W1Oabpa(Ctl2adN89# zgNe3I$~4i7W-3pvb3bmqk(=i0Y7&a>zeJ1L*1im#SjIDBtF33Guoao?dd#0T8UfQD zeiRCG)QkCt2@GcLJ*rPKPk|sVs2F3DX$exI;GThV+KU7v7`9cc1g6;zA$5n39RGc6 zes;=`wu|EKK6>+c-#Gmgt!N2X=?)PiJ(9jxzc+EA}E-*fms$1y^u)I=? z`F6X>6BO(+m45GzU?wJsjR7CU7J}>$F%}aIsRo|HZ3b0p;!lGj)GS{aqK9=EB@mm- z*lRUN!rsLDi%Zhic;Y-^XmR4fG)A?d0Sw^3-L3M@)2F9bLj-Rh25X0KxFMce5ki2Z zv3~FRo_ z!4+eKAX1jXToc@(n3;(PW^{;MtK8VNKb^X{&Am3OCE! z^yh84(Q;idhhpv~;v{H*$AKsUE$3G*hXQ&H$?1<8iMXB4VJiw_FmYX?afg{EbNH&M zFp1&p!6~C2p%`yHHDS&SYU7k3aA?? zM1veDTiJ6eyVc=8J?yh5lh&2{b2ttpa1FR>WRIQ*F?P7De=@Adb7=9oTYN)2p}MGE zxgS`%(aPHr^C)EBmQq*OT@!3-gGrHh9a=QVUO}B-HryQeEPHN-x7kn6knwy44`BYOFza7@h@W?<7t>kzLD|Vml2>YFwN4# zsGEU`AgZS>Dg%~9Dgn}$TJ_ZKvNq{f`G^f829imH@`E10>c81KmLw+OXwd+eeWQ`7 zgBrQ3gSFowL^l+5(Ma;cV{I;pu(W9ehEfk0T|G$g#NVVZzSPsSLR3)CGcjZ!0tZlC z2eC5rr5fH{m^uoQ8|T|KtM*3&yX!Q#GaR=`B`2U@wrUBsnd?pm!NBI0`WT%>g5Ekw#3W_vS^@ zg(C;buHfW!QOHVPdT~>#N}tGv`kf6AKRx2x^8md4i4L%;V$C1_y-!3=P=NCPZd54- z(cV`fw&DcR<-W$sYze_ov%n!JHY?H`DIEHfJ+9quA3OsQlS9T@81ob3>wt>ao~iZi zbv0kO?x9Ctg@9#izq@d_1o6!WS71Po%rNQ!3A{L#p|=M+UM6NMbctjP-xkKyidwBP zL;zd_2(b8N{aM4j00;pw2T>S>4R+urLHMa-S`wN-#Wp z8D$0FicjTVN{mK6u^V>&RVe$d>vFA}{eXS;c$r?-wbFf{w0kA`-1clM>o_2j%#yZmu#pKqXeb8n2h&t#YjkFyYXP&H6k%zOWDGHTU}UvP zAF9}K-a~_dSqfcCMriT*+cOQ?G7d4*tI2ZnEyh~6goA;9A1yqh!XN)aXj=-=(u-~^ zApq28P$dyZBXP+l5KIxR!(9VBG!Uesu^%?OYx_JZm<5Te!4Dcnhg`zonq!~-Bqz1^ zk6rtMLay5~fE)+#aq9tH+qnMN6Q9&hd&jPSu~!EIVP?W}IFca3ja{(;J=~6sN+*jk z`i!}vj+wPRe$QjTM#aXLq_d=OHYftMUb%_%e&y4A!#O*6`Ixo$WjXKl$t|R1+ls|9 z6GZC?lQY%07|H`j8aq+@C#?88zGaT0eo0THi^&Z81@nQhwmd;2g!pJMOs zL!!m9(heULv6}gNND?I(QMb~|@j0@Sbc%e3Ib=eqFOEPDOCTV18P%hRBsxjdIWh#@ zCGSu^r)Si?OA3P*B)tzprIBYCb|l9w+|HwW7XmRHj)_1Q=gS>fF%D9(A_&Os2mF8!ZGV&jSYgy<=J)Q(E(I2G!n6O-4QC0+>4Ju#|4 z7eop)0+ryQmN)Uzs8(n@3DhF0b^*HhSMK1|;ef5zF##Gd!M}*|d2fVI@|HX;C~55N z{oH-N2fK~V6G&>EBwNdN?kfSq@?HMAWm!FS5|2*Ozm^r2^}jaVdUo7i-v8Rup5W~- zEc1_xv(uTq-2e6D(b6Cr?gr@mTLl+WqwGO$7BfOszpqcpp5&AED?{DPXtbhv0OPD5GQLMLTj=JiB6*TALMR~syd)i zg$GuaTFX3-nAVh+>Krxyl6VlF5!>?Ra`Zx4yEIx-oD*2?=KD~{SU674yYDP}5lBP+ zVIlgX8E^^;m{BSH&Fe;c%P)h3#SrmzU}o_fh=qZRc)!1Zhs@t#Rd(<{zVW?0y{-&8Ykx zXer<&LchZlG(h{^1qE=r#HAo}=op`N>j>CqemyEfQFSR2q~y>@$Uk(QOf-=84G>Cv zz5g>~1!pf}A2rl__XsM;thX%{oB^yN7@-1%A?VZ>PE(z1g|i5(wI38MM z(5+VNwBG(_d`g7o-#| zUwsUZVJTdN!tOI5MgM>LS7en!STPhyX|*xA@y{?Y?G*IK#xdN6OY&B9ggwM8Y>lHe z&i78`pN?En4A?G8A6CC}uk^ga+?aDViUW--FiEzBrO|E_VVbr>3}!XToD8D$&b!d8 zAGYF$ucMixNMp+aN&A)|H4O3tMJXl^DinkdFFyHyL@_T$|4W z1(>mff`1nWQXac>zb3>D|1AM%$|$H4F8#I{3JQ~}{>h%uJC0cQY)inPmQoxS{N&?nOJeM4;TL+&l#mbq!nkaDllt zNt|L_XBu@`uOvlFk|+rr%kpU?VaS3fajW)TQgPdH))gD&dg$Opg{HBq=R!?CAqL~0 zrM?LxXrs|tK@0+PTwXi)-pt+T;-bS5Snl&%GYK-I8IkJ|51~3{uj*GFui5P{+O{JClIU;2O~x=8 z5HQ?ADXxtR!M#`e08Jm%CjtbOj=9%ODUDgDyJD7a=5f}O$uz!DVS3DbTFmGf?#XiO z;wV+@sGkPDW8DkJIZOuZB0jkwA(T#q(odKfC|~R8!HioK<3UC+W!%469;U>j{Gaf_ z=8wJgb&m(fBk|1U0?%WOVzF_?;_Gy~E`nq`Y9~|`kFk?ujz&>h(!svJJt?2*wXQhk zMGRf+GfQ|=Guo+bf_4)!@2Fh6<~CTD{3xC~Q+}mE?2`D@7us0Nur5hFT7$?-4K_ux zh{xA-YjeqmS7(qL=ah^i*?F=`PeTDzGI-{>-fJ>0)$2>xfw)gxKIm@MY>gE$-K;o+ z8jdmX>EvhD=?;^VkJHu{i_irOp(D44bYsp5*^L^SZ)s6r>kHxKEk)eyg=WnH@*5*( zYOLF7M!n9=3uTqS+qYOI&;*|i>85s*6BJ6cE_TYW8umiV3JdIeNFkLVVvWjlKegVh zR?C1~sTwP7kyNEh151KCXYMao@&GDW+3P!Ek`w6 zWMRz8nuuw$qa+eif`7Cw0tIZ{I3XC?q4*0P8_Z&`g~c-)J`#!!=jU@xo))I~#|FLR zC}7kbAzrI*h0>1Cnp`@no=Oo!U}z@XmY{ILJlY!3FYN{kmbQPI+E-U)0!8z0BGaAx zXzrC8J4T#SzL?t#PzW9R&?1N|t$p}7X4L2gh zwUxzQb*N!6UG6nWCXRi^wDG_qiWkwf;x-J}quL;?WJ(QJ9(!4aL_|8HZ(Ik(YK4LK z_0WTfLld+t4cf=tWo>murO_bC(R7eCSLa{r`l@x!7kH_0#TQI{=PTj(=Gn)73A=ne z5{O1aL-{Qq`Th{o+L^{Vq6M}{fc}_p2@%RO%HDU2O#zMz_eMH5J9w`0Qa9K38n|4> z>g$EuD!x#*Q0S;gBObQu*A`1Yc@qW*naO85tX!p^st+J=Yrr(S$dZ)VxZ8^ecHAhn zw9lVuQ)^q)^S-~vLo6wMDX(|E_#)Hfu=<2yG_}g8N5NF8`SEMZD1;-Q3Pi4VT0(?! zgkjnw1|b~@olY8BI-&@WSeE2)e(9iMV3nM@rDKO`^0ZrwCXkzd9_^rd#fZfufsOCH0l z0f?O@ga~hk`?;2JPPUY>m{Mdj4|FFovtj+%W2nt)F7*BZSSS ztxJTvyQ5Vb#RXDm?>e$#7L8uCzG`c>8g4&bVRHbkZzv%rL#pl4f`oR`fD%V?09Cx< zR)S!<;*NJ>Sepy!Kj%3Y2z5>C)~|62o{-E8#&X>vrc3Y`Qkm>N)Fe}2k=#lmrp z;s3~Wten{p$6t?kz8(LgG#Z0}YMj4xxku|UvAL2m?dnqd>%@>o(L;r!g2Z0AL#fQ; zU*pgrM*@T!@Kwapee;py@n;uwd$v6JhJ9*w$@yx~hwI3b z;UDl!gd~0@>=#66FOd!08!8cmh@<5gMoo;R{6vBxeuk20vdH z2J6Gd;27X$EP=aj7MykbN&0>Fwb@l8CkaP!5SQ?hyInA>4D2EI;fv~w zH~>hYU0v}+t>at2F*sCA;z^M83^hx|sVfQ%p~9Hi^Jc{zO>g2)#Q(+#VQzxv$$X&j&N>$0dB0|NX6Zcn*V2r{E#YnKkXkWP z;6-707lhUQZjkiuB^cG#5tA5*=8OS$;7_4Co|A;%2Za^?4ka{c+#xja$&M;F-N#&APaOLv><^uO#;OBZfZg0|*yGFxZI<2DStpbtYs(EwE>gT0DF*K7K6PhnJK?R$zG{)Q2Q2yAfN<@ckdm zBbFiEAQvN5t>#?SB5xETm-S$NLyz&9Ua1X^SgrN} z!QY7>GK0|azHeq7GcAMgo(~flP93ouZFxLom0({@9ekPO4+sDem{%cm{)!vcO0`OV zW00O4p8s#;o4?qufBD#0&{UH|NZe1}WadLZFp0Hq)*I}6@%GBUy9yuhU<_SiC9rok z(TOH%ryCDYLL-6+qyrm&fw#@Jd2P!jm-7`vKa)yyed?$dxB-^j1eY=_>ycx1A##@u zA<@H)Sca6o8KH=3sgJ3=!g+C$U{~m+gRNvcrdfBxs*@3OkSCmsGk*EexOaDa?(@-H zThi~%NWxEJFTRRJcgGZ2n0yhzkF}DLM9Z-2iw$(wW8efNGW${WRM_d3PsHJm;Xkzo z_HTFslumcOLJ74Hexu&jTSrP0qxgIjt*7=_L=hJ-<1+ROY>%2P_8+5U_41?E3X<|J zhuhP6APfe29Kwci9PlCUfhDYfhulSMsxD|I^?T!RHA8hM?Vh2$OcCP-w1H%h5xG+G zUcBM0#&gT5V%|M46(6em$k_O?hkcGt3ngYQ&RQE~y(qS(1|xH59trnR*c)*jE`c+@ zps~Q#M25)^eM}O|G)=grlS#o(sk@i4XJZ|gn+3u_cTdeO2-hvKI?6g%ug){S)!UH5 zD&~Zk;TWrT)FDNvu$QcZQk|+K%=}5a7vz}oNq%j+!!WItU9T-x`IFb7u zU=xC|pdMUhi z>fyBi6{HLbnju~CA#+oH_*FM{z-vVbOt}bg@(fU}ML=u=k2RD9MEezQt)MrwIIiXg?etEb69P^xbc2n{OsjgquAoisHP7Dq zjtqlohY_seMj^oCJW;HEp)C`+!mIz|SmZw#w=M&&vJ4ts{rm*jsc;jZTey;xhoJdt zxI53B5gh-xmIC*w#BduwnNd)93ddQABre^w7Sv8ri3o0q6=X{QmWTxCmlOnECN3nr z6m`PmG3{D+z8fXMZ+x?_XgJa@z68zv{(W$u-@X8clB^7r8(&D^G#LWVqzil}EI8e{ z5|XnWC697Du?O0`^OLOZAjhy|o>c1|e3bvkvjEQ>-AE$Tv`WQQmxC3^ttL-g1vM$0 zy}_bqX1LSEI*aBrO_N|sXqG`mZb8qn#6zZbJ+^mpu`X+VuKmXG+&XGJn(kRkc6wQb z{C(A^X-d(?h!f1jXD`Rd<~AQadtJ3CBjkDCyCq0=jo}z+7e~0pUWWm9@l)v<%y))0 zms?aLS|WWmm)*A6t);9PU(dN(+@YL<#0x!|$^EdkZ(aioOGa%!CE@E$8_Q5f=`tc|{-BT@k z3SN@iZW0ca+Wx$xv3sF~5|(p|R$i02|63v0+`aAo^6V0XzJ}O$>N1UCJP)*n(~>#x z?&(v<4P6HvP`Y0kDo>9_PHYW=O7`b-dp-Nx?Sr3^?uQ?L(-od_ zkl5N?;OhMib4q&NCG2?j_>gi_a?M4I$05!8m73Bei00)(gPD@YE97~?koyNQCI4dj zkx};(5HA!fW4wuAe=`2(u^0Pe#Y>ZOxu`>o*?efCg+(E@Mye4T1_UiSu@=Bf88s!qwBN=wyTMUT!d_4~gd92GYj{)lkcz~>0 zyG8%hdGMjAC1D{+&9?}*0aJ+tAc$cxk%(mooQt@NY~8esfF>KluROew1*D6NiH&fZ z*nw$Dl@O>~RXkC90hug@H3>8+%hQTZ{+Bu8EOv5vii63@#u2=90w7tD^I83)=~*0b z=@{X6s^|*USco*t!B!vFwAW|EAB~jx_yls_F&{1tAQ9EukACabKlCHQwf!(8dVUvw zj%wq1;bdU4G4lvs`Vb}noGntplWNZjq{*I5V=CH5>l4|R6siIP46u-esU-BQ8o2CpHL8PpRbaOwaZj(i6kgvm=>B6t*8cri1g7jr zVHkX{=oqr}F&NMOXDG3PK-}%MpuOB$I@@*rP6@bw2h5viQB*2j2ik0D9eHj1EEudD z1APC(?F-^Vu!ySlVH%X*r))(StT~m+S+OAQ1B3&>&Vqjc(Jxx1C{~1MY_s7yBEFS^INp4*vQfQM~kYi%0yh} z>f;Of)Kig2I2`Hg>yH3rJG&Z2AJBcP^*(l*HJ1MW;8(BZWF8#2)ppU`J)1{1 z*K4;|U`5xnp(wILUEMDHx?B-rx!r@+(^JoMJoWPLX7dHaNu)2(zyGeUV@Bf%D^?rq z8v-P#m zJ^9qfW@ct*XBLv9uR@DQJ=QYHf_8=Up1WGR<4mFZL|618^JlE<=yRp&(kw}lD#_PfPWxQJYSj_Cj&fkgg7qG>yxjmli@x?L_QX+05 z=cV@d*GVU*Dh#*xRqA8{@4bew+8T(%JOx$WHBe1j1TC1Z^>Wp0)w3!n!0k=!ISRgA zgd81@b1tWcCkVL;4hvIsvJrF2_TCxRxvtqMVi1Fkr)Wd z_VqIDE>+=y&sgfH)|gPiGGQL>`{BXHQ}6lf;S`Oe`IrmH>(a*@8$}0}puzSwW-x3N z9b|(1t=Q=d#?$FOTJ@l3zM4kn@VBw|qUiXE;b6CT2RKDyAZQBPeTY%QMXQ+&JPK0) z(VhXtnl}m$&>EeFhac24URfAH3d6V^`a;yPvUv71<8Ap}K%WG5DPZp-9|bo$ePcmb zcu(@f_{Y;B(WU$=KljRS5EO`#%r=#9)*ZY*gndHafou0o(8vfPry4~>xezA78~)F3 z?_KciK%VpZwr?V_BgF;wSFJ6yGVRfbFgKa_)!k%y_Fr~lVph{;Cx&9NxUSmpyj}lS zty*4|T;WUFNiXnik{sI03>taE_4Q#oWJd^L2-bQe&g(mr1&{izfRpUEH8`=CK?)%b{YcOM&2Y7$)R4WHAW-^hiK)BrN=}2k^gw%!VZMu?><1%pAmScV0KRrl}e`$d6C0W(K%DlmsR8EhdS?-=e3sppyIwR(dKbsus97o7nbNUVe$sSK{h4 zn){DW9{*j}6Ua9g%((`Zzr^ z>opJWM^8l0vpn*?Qrzg}eEO%Si)(yOZ!OJ^bcsK=xo<4`t^1aL*$sUY&ED-uo14PE!XeC&G-0-@7ysd}vCo6=}O z^+WGjQ?G;VM>RzgEOGy7aQOWf4KbN}5@tzGZ#X?BuAb0l7#&NX7gu5Dp^`NLUX$5W zRlEdt)LYH%{LS$2(9rO}Kr|__`0E0YtqLYP{ZjY0vro2ub_S-nS1v@YgEA_~vU^RQ z7EG;tCY#8ANL)S~$0 zu}4&5(9-lr;)s!ocp?f>e2Um3F=%$_1d&{m#(U!=p@?1-L<-MJeM?G53*KQO#z$nJ zS6;5<3x&$vP-O6sr722@s3!0n=L$$+{fS~+qGrCAT_bG|YXZ6SPc{E2R?YX~4#^!j zWaXcw4}s89I@@=z0Ws7y`4trjd_2boS?#jcveg#FupBqrmD&*du%)O4FnW74aUQEs75TM?#*L9*R zyW!9`)cCY($W)avwhJhz^B41Dk+aSz-D)C|vxQ$B92&!90x2PsyA-QJnF5ibQ_-cI znri;2V(;RKF=SPtuu(}N_~k2-AkYtvQA7qLog%im?xcFfEUuVwo{A2?PRoWsMT}hr(2P2 z9)CBkjTNrR2`v}Shdu<)V4gOw#er2;cC z1C>vg?tVsyk@kJlkXYFO^k-FGD;@88Q*;KnjlH$ATfrscrt4q*&74wCOziMXq z?;V;^kZMi@3wC>Z)6t|35b8iwy}55yK9<|*W|{Bq*QJcQp6^cf@(e?Qv_!SSC|GG? z-QW8z)qV1e?{ogo0zn`T6jmx@vIiB5nFk)san8PDpAu_~b$EKM1vVFs zfE!hJ4ZhPDL`qOkMH+)Q9~SsMT_2cUQK4&w_z3#I#^sDlf&88 zbp!x#{k8BiUv{Hgb}z9}%R=3pQoSpms+{b0ZcPFW25RP+FsHZ%<+kq{Y}^eg z^cyEq9re`coQfVPK~F@R_tv*)6Ralb!!sJjF;6Wn*gb+YxEG@XayRXmobbv}sm0=VCMTtud z)-P+nc0n7vuM4iOiS(Lm_Oe&sSGo9U3Tz!Sl=p0hSm9ajW+(QQ36YpU(=!y116J7? z-f1}1q{@w1%HdU$O|WBw>ic_ zVwkflH7X_?bt^lOctRp^ZOx@O)Y~%i^X$boUiUtguU%Vqd`^>^W9^<2mu8`Q3j$E5*tmAa`ZzV2UF;2h!2En`_Qpr-$mWxbBdMJy%D+VI1))! zxG>&jl#|>}r&3i#;y7G3VIB=s-7uCa>UwP|43yw7@l0YM1Hi7dUX%odYO-qa{jr$F zk-mOyv{}tlLNpcgGBqV>l5Zeb8imj(Dy2IWYBX4WaNFN@3Mf+kL&$CU!BCk`hpwbcg^L znS=Ha!Jqg~j(mAWF*Jya=D`yWi6BF1NV)xxQhjigPkTmofnbV}1&KKfws?{4kF+qh z-WnfPtN;HD3hi!mEvp{4OoihUOk(c=^8wV{h!%CO<$KQkk$H7DB`?QZXjziTMW4Zb ze3)r&EdrYrbQ!!U61{BQq~bAC)?$XN+ezED z%!ocPk{^=U-kXmLN=o?y;v@muuU!D2l(nKFVhNn&q(@C5jH)7F#HJ)sL67$rnJ}yt zbgNWQEjSJ#=5&AqGFge2(gASYa86q0GkPkO8m%})lsKm{Zy%o_e4p$Gms;V-;@stQ z|4M@fzRfG9p@ywud}-UDj!XZvI1NNVvFrG$q1eQQoe};k2X{T#Z~)?O=qodGct-+j zvRl_;R>RNpZx=wpEv1xRxMnj3Y5rJw?~eQG^DaYp6XIPbZ*%#5E(JaSSYUk&J|dDWb@8 z46mB9pqr{d58Q1)p&qo5Gzr^rajy7006cBUT<>81py(hj2-X3xscVhAEz~>@oMfXTPOW<8p8J=lCe-tA z@E7-&JLAq#J%}3>t4Zu)R(JMKbSr_ss)kKERlcqXmN=*zsi)WeGo!$nz~?rz!Dgpl z{H?%WqbfP&?6R(wy8mjPYvWAjq~K3p;hfc_eA=_>u-Hr;sb3S4P1=|VWFzQ{?6MyL55Sq zkfV>1R|gCj^3RiC&)l)8Bt>3>TPDtp9s4QC^d;l}>=qqxL=Cg$C9)+HFb&Hw)_S8v zC1RP(H`Q%sc9;OIicmK((a)G-7_c0JqBC{j%%LHk0cyM{N>yYs8PSj_8lIKun}3xR z;k;PIQV`S_jJ_UoI_|P@KhNvDx@bpDiLOnjto&K?FuGbYj4uD%WUmbMw}z3-WxYja z7Y3=9-sm$SK>odLW=56EVVu2AgeRIozsHcW`)jZLea8oyt2!s`x~E2eX3DbfjT7!x z8!koVoCnU*WW9vEs-GSPA2F21ozN|@b2A{G3=m|%z1Sj6vPTMq56GcuY)YuyJ&YvA zpm@fD%nfG=fGKaUz$Xon(W(RfK^-ab`VDU8HgcVFF5N7*6}``-9#Y!Q;*iH8?UbC; zuhgy)x80~~i-0>iIP=;5TK@7sMx65-Rw|C+VYWgL_^vJ0I;MCYye2@BH!#%Zys4h; zW?knfAc51*MwkKcQvgCR>VZ`nV_R6KDY!rmPub(1>T3C+vI{ItleXU%3LHbLc5HH% z7lpL935;x#l+rU8S1;&f{dvn6`!(d$Q_uGyhMoG$SGDz*L!ycb8!FpdjosHIsF>F7 zIOMhzdWL!l26x^7lTp*6j8#}u4>Vc7Ku`k`R-8c+_z1uW^Q7ZAW1qNO_I|TwXs1_$`4`tZAF$F3+1N9Az`wfOsjIbH!R5lW<-cOY0o0pglN$oSt>;#{5i1UiTh7fGEuz?ZXFK_v;p1R1n$1`pOx^1?7aDO6s8MT8W{8B@LYk zuf-j1Au$tb_Fg0Tpwg0+^mw=Q`t`G$r)w*-QZ{wZcOId6Y5{#&C~hT?hn$XXXrK;smvBmm(LGABw<1!ozz(L5^om zpCcTLKmc620Jo|pAtt6TkxX<+aJZX6V#Y!uK*2m=rhOHrHozp$-U#vwT>XZL8sC6k zK_$1XY|>Qhm<=>VOQ>ASJ2(AKdK5bj-y_mtq~_H-0lf_GA3OcBtj*-S_)VJ8r#mul z?X-5O8=-sW!H>bz(iVpEUoR9iznbA^xyT>BOI*KCIfU`6_I=iNa(Os!F5Hc=&7xG0 z?SLqqD|olwDuW(9a#e&=+j{M&z3p1lI8Hp`qQkhy*f^7{CdMqiK#ANSvDJl1JF0{9vx>33>?N@s{Z; zL|F51CMCxZux93-H_JB#^Z|kHWOkj&6e)5TX72|;ErB>;mM0li3oTw&*xxmvDk!n z);l|w{-_qtteo^QvlsdjLyuO|@V43R!aWcwCef6&Xw6iL^Jjy|E4M(7k@$<6tY$4L zCE{ElHPguaPb2iYkac59G0RJi(Ct?6#dpXzjN_ii?%$dINzkmJE(+Tm-rK_Yi&LjG z4`&K;9Dy!T?n?EhfIc8-K(b*Ay;7heA>y;h2({QQB`EUi;pVW3XDz9B$_CL)3QQVy zS2@oqHwEeg0`1cLPO{<}1&L2)NU8-dnZ8mubkilxH4_F2%QRHYB#3EZ2o>#G(U9GG z0tloDNyM6VkFUZ)w{ihm&=2x8$M+}c3zJWoT$ZL&sZH!wskscIS47pHnuj%a1>rMc z?+c7h-X&)nO8N}@$)Q>|r2cGXI)4B9tGBPsk^t*uxunK^oEK$VF??^8kZN~&u80$; zU(IX~w^z?Q3#>K+mtw{deY})`emd;1D*Bl=f(7iryF1yB-GSYSWp=57o;U1wnsI<6N&(qBkZzz`u85k&5X z=?U<3WZ<3CK&t7q&WFejHccN9ZY>m0aIadxT8ia(N#tyr20aa+ADS#e(inOmpNy-f z7o{{c$8l}Ipx1FYF^~pWtZm3+u2510e|KreM_L5iX4Un0BbOg6`xE0NXwV@xc3LqJ zfnj~GK##JaI)e64muUZmVtJcD>qwm`2{nn4o6mbquYRWV(=6l+Bb zHoiqHN8X_r*R!CdJpf8NIS4z}3XIZ(!TFp%IC*TFLpB^(%Vwf*dlCr+cxce3PNIde zJOCjHEH@YfDBhT#Ia5a4H#@#~Y0K|UeK>zH#}IPQD&D`cXaNoR_|#|DnwMsaTJBZj z#_QOm^Ot7Eude1^`O%rb%s*tYIVDXTtJ0-AnW@g7SPDHm^(8C(ix;wOc5Z*O z-P=_1huGxf>*H$>03Otz1!XUdcVsz{FO3xsv>5#A+tiY9xL=1wqmds)Ytf|D%PF+f z=vXT>;RH1+lTUoB!tEpLKR(U>+QP7B%bJ%O8kuT?wjdkHj_{8S;^|K3XD5#M`w1Z< z3QHVn1STap*}p+r4GKxdP~La$r?q9vnbeYz$@ri#zx{{BmZgi&4cl(bDjS)cI=!Uq zDAiT35|EItli44Hx%r)&e7(a7^Kp)Q?%@Lh6PMQy0uHWJau7J47Ql1DAk)Cov2AxO z>cXiLV~D^|bl(eQ*DNdrPy%=ch+vc{CalR*uSk+CL|F48Nru(DI>@Z~@H~bl6-B@x zTS6YcVlFzi7aF10qf-#vg*y}vl@g2a>;Y_12&hH&0bJV%axB7z4nR$^)SnQxVGXwM z+lqh?OcMZha5=blE8&(ad_Ea76+S_%#q_4+ahn4}OV*Xf0tcF5JD;-HkQ}|ZdF4~> z06+ujkIHkG;ublnByX`k^LFQQOcPkkVeb4_HhF7Ip>ykaD86b7^)5(Pjtq?Y>uLnZ z!*@*k;0q=Xg314JeYGrD13G4!Q<1a`iOJS0-~8pQJYHf75L%P?Kn8$as++qO??4ML9QuA z$RXnsW0!4*z8%2Gl(`a2W}3Xy!JlCyff3Pg77VB-Z345`Wn(@Z$hTwjT9!W4Ul$lq zO5dy(_km~P!TyawxFt_Vv7(~rrohMrv+}N4DU~W(Tt>xGOa#CL{1+lH0FXEYzz9*4 z_F=84O(?u+OGLrcw%fXot#to3d#fdQS8~Vn>J)ai-_4_SE-}Om%dDKCOVuI7vry`% zueeL2-vwx&t))3XW?1>D#`w2az=s;qnpWT)pY+Du9rN?)?8?bUWDYY{8pU?UA!&X~agZk1+dtc3R zqj$giS-l^zGv!ebGD5=`St?u8s4aNZe{p-v1VR4;P7yN ziE3p4_!fEua**)_MI-m5R@F@C-7~r_Zc7-*_nvXm64URhd_<1Cl8_X-br(SHfjSy*7s%mGkG0<(5wDe%9H}N8mdb zT#jy~)0IkETMe%kr)q%|<;$swS@HNp*{Gy{dm55=@r_ot{1I(Wv-Z%2t$hHq$Ll*f z{&C-KukYMBvNDRUnnP1(>L&UX=&{qFzd>mWCdV1b5N_rf;;KEJ%t|_k;#0#%kE@-J zu3PRSk#-gkF&^Esb$Z_4c<0>@I!vA&ygHu|Me`R2cDnH88coDUJJGZz#<+$Ahs;3^ z{fZ-%(-a@F-4wAy-OiS1ipn5Km7gB8bGnu$!icu5YT^lzWw?;#Ar0NrJx%a8wi)2c z>a7-Bgj>Ch!S+>Vq1U5+38Fw>>afyJ#bJ&z$wpXhw+I8k9!4;k?~}Q05;Yn~eq%>E z#30ON$^->M^=33&SHh0Acdtb%_H=Yj7YyN&?x z#4h7pP;BjzFE$NaZVv2AZM_OluHhV=@OFl32SuYWb*pNPJdKuV**k4G+S8#4dgG5g zyyL{>gL&<1BcqG($ptG#e!!6GQ?DlI?;B;@>V>R7tR3@sxTz<9Qky(JRki5AywZcc zGmdtImPY1FOSYDFaiD)ClOHuTH#H7yd|cNWTNq^*<1I@u*^i3vT$MOYzMM?1 zt>0d3`JEg0yyDZ-a)f`*K075@Xjx42k+FzmDsn?gkuI7lJCMLuXmPk^vO_>ip0XU z4qqpdGb90WY0K;@X(jO45QdthUkWCt!mZcX#qW^p*8rdQLU5lAo{wrp`8Ke>$}s8djNL9*A+kr$}zlWR;;-Qzx4Pu zorhz`({;s3axzuo|DGDz@xpo!&{`J!xdesTW6or4C2nm392#Ebk9GBtaki=Mo=(qyRUMqDP3)LR2CB!d2~us_*=xd+C6y%q+scrFw6 zOYGUeCJioYoMs=} zQ~L#FDo1A#gR4d%3WBpGg?$&MvIh{rdxnLTy5URE5~l)}S#(RuOG8u=Gh?m{W~-vx zuE)-Vmb{%S6$^s%v(F`V@WdX>mzFrOd1Lb9?#z*GWHH|@p#RwCqusn|c4P3idhr?S zT;fwzAL5-yO?}c6Z*@|GEp#xc`dhz2YCf0GZ^8gJ4{kYZO8=?exT*gR0^t6wfwYx| z>vBTe_#4M^EZmaw9PrUKd4|~HNVeR~tmN~l&EQ6G*MPHV>VR25s2vXF3HDvMjSS8K zTrwn_-*}lXERMeEB^GqG6)g7L z^ruAL;60i%b?lqomy$9%lf0AyBX}LgZaEkB2Rd$$=ffj@UJXPfSP9_Ad8DCI38J2C z%Ea?VXZi=7vUkJ?yV`v9<;n9ZmTT(dke8TT)O3NZoXGFb%(1X0y$5e@epKK&wlwhe zG2NiCG(4VLi>kF6>JwuK;}YUzLWwulSFM#!uA>D5yLUo`5H?FcQzx&gvaZS^zw4uo zy**>55=Noquco;#&BNHS{w4>YA%lD69w|;MI}S&0I_Lt#oe|;TRmeZf#Mqg=Wkk^i zu_9_#%9Z0*V3}tU*=(u}V%I4GM8s+0j3oe$y~~tIq{i&H4ylCBC2{f(M(IGDJ@85>=NbZ_RnYxAi3?`M(b%Wwb5LG)sHqQ2Ts z6eC6c(=cWErGzJ}uo^Aguqu^2>;q`!S>8%?@-#M!-GDvt_CCV)V|jQna7%vH9IjI! z#LL78WTIu2FzU&xKRP-=js4aOG`FmLW&iEA zxBEe9n}zZvO!-fjk_ld2Rk07y{HxH#RdsqIiv|H1F*w7iblx4e!a}}#+A*=Ds_nW8 zVHS)lqd^EYF=QlGOM;j-dUz9nvT?MJg@vr+h4WXu5U~Gk;zhV$Y1YJ-%)|UoJ7zRW`VJW*-t)BG zoAYD%tvF8t#+j`XJ5>LhlS-BCRek8YD-=#Yt^8+RX@ZkOQGg@(Tk@20 zwRHdLp%;f%OK3;ngU;qHAJ7`)Taa6e(dYrQF@^b$O_+gda>fOOD zd(>J)17L&-!tn44Qr2iXZq+B=Bq2RrMtNGxg@8}mqj%@LY1e2VaU987JmcE1!}va; z=66=VjcJwswKc4lt!DkMBq=ssbXs>dOO=5!H6}=@kms(j9pebJb%sCirIOZ&k4_+O z+>$yJ&XS5CdjMj6<#!BrSu?s1-}W=rYaRImurRG9!McZW0(%UvcI+vz9_t2|O#Y7+ zDp>%tmQ4D)&RknYY88{qqOCyJR($c1G=PRk#D}TEcK-V zq`7z7U(}=OynpEN=FFAMFM!J6$jFx;+uZqos;<^;KHv51_y;e#)%ZBPV(VHOQd8Xp zd>?|au`y2*%%>b>^V+ARm2~ucZT3|!XubbX>$-q=1~LqVj4S`SkBlr&y9PS6d5n&o zT}_^!i7j2XKP=_p3GiyU8U1(<@yXzju6{xb;2CG;wJVx>BiR|>Z)ME%z@KboO|H6 zdnZim7lk3EWKvS*Srn738&MX7kwa4oj-QQuz*D!mq7h_6eJt_gSStU)N0gOKjqx8&}tG-?!h;F&d7@I<+el(V_Ju%r}(^bkUd ztJYOdnmuzcq4_UwbFv=8lq8G~+wJC!<6e;5Cm(-m+X*(?4C(bOCWTDw^J1r2S`MZ$ zSlA|=%J`=R+F4&?_twB)qtPzRhPQZ`)~l1S!^;_&@~OJE-v|=f-CaFU11ZXow7@xh zGXZMceu`P{*Q)KG>bA>1oWCv^3`0J|s+49j3Z zFdAg^fbXQ{j2X+J9gha8)MUAx)`8dKxBK65urngJN)fH9>OqbZGO5tadGO(6xR-KY ztzo9N%Edb-_aB-SdgL?|V9syI7Te9TT$Z_6-TA;Me}SHEYOE_Z^*m`{sB}gk%k~`s z#$|HzWgGv#|183Fk@(tL*ul+tR!F1m%#*$Rw;jKd&>lB#Xww5O9;wQQ+uicfBWs!K zGT^sVyj|4Qm>4(OlECpv1g0FS9Q+?ketw-#>$y4TP2!mmHI_olx!o*k^y7Og(Bqj` z_F17ij7w`Vr+?mZwJ!S4!DmEdC1=t~MqX{&V5pXgkYwE171b{@v^1+FaBepD-gfH4 ze{5_F6`6H`xY}2pW0-HjX8L$d;)yl>qw3fUzDw-gMyp;98>s*uAstb(lgWh6c*25* zK027b)|zlgrGi+qy*F$B(XJ>ov~3eAv8>tm;oHfua5ZwRS2yKV+pt1skr&5-JwWn) zAvb)?beMiv5TOkAcOiIN^CwtzeoMjOGw*9|z~hU01ld;)&?IUI^RrA1Xkc==k{E9lD@X$`^7yk9qiU|ZjpKdZ zsAnTCORkz&iu(jDpMJXKA3Mml8|nb(0vECx@#-Z3p*P;VXN}idX#m^$6Xqfo-i`4~ zl;i+{3={Q}dJzVkOAR=1tHnQE`c8(_akQ|49)#HbN1J+7JD$DCb2a=h#Wr7%{r-2I z4>D1AGJKnXbjodSxM(^S8ovYPP~-U%X5l7S=%5p`*9~Kw4uX; zo8e$lyU-xh5KZ1h3Oh?!I*W$wrWYH;fP7s?U>3FD4004qwSi-XD}ToBDzc03q>~e6 z9$faiXjC<-r;YWbv8)y%F*B&yMhT6wPmK$65^JA%&FaY&3-jASXxuDh^8K)eYPDt! z;X!WiZP(RAiw-vSWo0UWJve~u{RE~t+i98H`>g_6b|}o9@Z@VU-s1Kc0i=-N#sU{o zMKx8gV^tPdCVe1gIYHn}E$Dj+(w@3U(p`#;qb@)yC%t%OcB5qhm0w2=Lu45ukE`I) z-Q1Uyp;hnTKjM>o_c@&b5P+_##}^R)ymLtRyD-0-@z3gCq2Y7|a911$1o;{y(af;E zV$8UG7ExhTnZCKeRwUC?ynN2e-T|qQR?0TD+e5%Y4*^}QrWnD70i0>bsbt78f)d(9 z$ZZ?cFjd4lvly#*&_E5Aq3UEyf^VNYuupT3leeH#QYY$hUU~`&UJ(HcH|K)Aityn|;3D#-TSGM~@8tOMRr_-5W<-S)Mag zJCdV)jS)voN8F{tB}3p_*hvSBX-k&5?7(|%-?tu%IUE)G<%zK44TaFnpMPdipevL2 z!?L{BBtiSGDK2f#1I9JzR5HmIAp#c>%F_m17HSQxW>XLd`q*N@OwJ?WUJ;E58-lFp z&@04?ln$LrPGE?aqNCze%Pk z#lWz@V*O9ENQF={k^9#)eqgB zi2)w8#-qA9Q4;0IRdJiIaZJIBn!`x#RB6rr_$jx&y6^+z{uW6q);N;t#auS~uZt>` zdcDc}nNqJSjy8Q9IKaG4u^(7{_LwtsXtfSmpkK|?odbmRK$GWXmD@hInAqKbdbn`` zTUX%yw>>Rx5@(QOT8dAfBz>%B0o`burq>zg9dJEt|9!5@}+meI!#AKq)Gbh85* z`xBss9Wt`jJp|XK>J&mU(;iNXV%-KvdO=B1EFT#VG%Sg6bE5+q`xCZubjZkF0ba#% z+IPH`ha0JqxNYXNS7aCok^*Fs%=F*Lo;YWNVFH9aq5h@moVTiBEy)fXBfv3lq{0Kk zA9Ve-;3z1!;vfT}2mCIpOU zWrM6W^fU1~HgCpltw`w!{kXSXGh9RX}y zuvcQzv=QIy%3-s%l58#&8wBr}^pBSuK`qEt_}P^N6=)74j0h(P0(xT!)n?V|5dk5P z0C+hNd_zo|j4NPwO)pvs=+^uEo$*} zEc~rkkE5`n20Jzd?PdoKW30mDHAM-nWC|#w<0%bED7LpGQO&Bu6!d9d<~LMJr7+$1 zR{8r?>!yJcJtU*BkH%5%lZRpI*L*tS@tA{+K^g)7DLgubB90xSAF9Xu{`9c$%#Fj= zpt@)@)ctZ{FQOW%Tv0jM6|6*uA)uWIPY;h$a=#dlfZC{-Zt*Hdt9dJlb?C!3^r25$ zJ?FK72LO*9vV9hfw*cg^LdWI8PeMSC9fBj(e|!23z#e-L4MY%Cw+H&zuSUA@&g6Xr z{8*vm{abuj!5=#WM+jX;003E``hfvLw`Z+XXfENS) zB{Ab)kjoc~nqE?q$XYBW81Y9#eUCYhrn=f77S168@tfN?AoSP+F}1aiqa|HotxI{u z$8;UKEyX(WqUO3k#hIQtl0G!S7HF59Y9OonhpfODq>JhN>Whks39d|T$~pMVzm-Z? zUU_ETj6%+(INM=Gfob%=KJLRgu?{n6KV@ih4WlTehHU35yXrXZaOikju|3#$`dYk? zcZ!$HJB;0qO@R|{VgsvsfHKV*O`{1wLW6kakJ*ciod0~JFg7P~IzQj@k?$>^?8jsWykfCduB&ZTEm_{rXjhdTRB(+90 zYD}q&9FAUhaK_{?Nkv;#!Wyt&!;sd6eM~bf!0gb`W;A<@i)kTw=Eo!h&Q1G(RvU?l z?r;l79G-qjddYKT5fmrRQeaN`nSZNd3a^_?OHNn54M#$!NG5t-m`NPJj%tv|x zn*QzaiHS;RXL+F}Z{-zLy2v7W@{a{~Rju$FXHX0-n(H_}HSwPp*IU9XXLgdhbzfsh>$TA)4gs2O=L6qgUFdJ!q5~ezZUNv}{W1v_ zM0dn7u0Y-7ZH{5Ucg1?k?4&TF$)hBkXctbT^jw{&=E$TJ#ZBeDhK)VR6eBQwb~ycz z4?Ks$LZ&ts8D3mlG?M4$Iv_T-y2NJ%kH2`)7);MUP*g%Rri!cj~O42N{Khq2q z;dw6qAOn`vOIWor2w}6dEGEMSUMUXJO~&9l%BXIU8A0OQBzgR%+B71k;BXy zBs_y@U8~7Z??-@U2*K9j5w3ZSh5m_D8gXI-TGjW3Sax^jhcZQJZss2T;lf1 z8Qqkzej}4Q@iFIo(k#_4DfR0@wp$*mSVnOVIc~DSIy#C4Hhh=TlY$SDe3;Zm~n z$}|)ytAwFHu^@_d`U;pt;&m-n?E*5@rjkhxxCH5V!0IgO5)%)_jv9L}COBJs8E>IN zj&g@}Q#wWfK2#)_bnqG>;w&ooNkN)^xbz-v675#Km`ZI~os`_i5bR3`>Yd#}lqc8| zAm=^v{#?r5I@+>a@sG2?;?;$*Ujs!;+8c@lT%*D@8WUi-?uf4~L1Rp?PYi)!&vra@ zv4C2Jg3xh=*_lm26Vx+noeJH%F(?Cs5hN&PXKm1eo5uvA;HXFj2+Yzk|KP#iF__vD z7o}^|6EBLA#BwC~Z44yJtoy}h)YXLi3FStHzh<7+TU1U+1)gsu5JmP7UEPd3p>^>;UNYHLx4_9y#;p^kFxW2|O#A`maHCr3pU;DngCbSSs3yz^(bg|XpeGHij zgeqIbo4tkualaQlxoz;Sk|jj7Cvm^f7AyeeLP@1-b} zJ*;OMoo@)F**u30`hZuB{Ye1aPE{89H7Q*MxO6Z%)Fo%`i~~JHWC2=6TD7C|TMT7G z1g+gK;Q3sVRU-CllI9eflq@C(mnMmHO=FONa5i3#uf%yM&nt+Iu3>6|)F6SI#2x4N z6RnWT6*S$VpsVWEhTh0#c{mmgTMH!2Go8a+Z_dst=Gn@Ir2-@R_y}9HW*J_ zEn9~g3u;F;A}+;mt5z#va`ZD0fxYD;R{|Li18E%Zkyk$g1GBEQSikQ0IOtI9qmqjA zHZ){Xiewp(gG|q2Ruz79TAx693&NMNON}R8jtX*&jm2KvHnLNqS|{8`-=fwRnG{#(OfZJ2(R^8X3V;X$y0iWE(nzScR`9^ubgXzcFFJ z(z7aGs5mVbLdn@_ZJYsk;@G-#5l$FB%@F#!?&U<*?^w~H#dpUZZuFwh34GNIb?#_C zsGI6qk1cSXl44O}K<89JcL;q$TV|zh3p?*F4Pm*wLeGr8st|MVmXJo#9wCjv&?FE@ z6mEYQC2s4HixGZq+SBKJ-yPY4g>b}_6#z?=eA#Hzt%qAezSe1eYt(E zJ#Qp$urFbVag2Vj=ibDGWe8QebPV^|o*go7`BuHYG9}j4Ej>}Dj9oB8pI_;fY5UZ= z$GE0Shh&nnFZM6`*>)a5pP~ckU9>k6zQB=M`l`#s_lqIX`qAi7 z=>pi_%2pgZi6xb>uGu_~EsW&WFn{3K!#Ii~CuJh~pC-(T;;G*5e$Yx_=!Ait=mOS{ z0SU~kInKAN>#|xcYz_e;mNXgyghZDMX%OIJ9Auq{SU4(rlE|dbgp0DG*+7PA!K3Fl zuPI9Lp*?`*z=L=_ZpckBw~#?g2IoUl8zpmv(|rMb4SdJ7as>V3o6=$wbYDX)4#SI!LZ>r}k%H^hi(N7!A;fxjKi9NbrU?EME;(y1V@kn-9(4RWaBShXr#HNgu?+ zj5MNR3k-GqFh%zSUuO2&HvBjy2@*Cv#2& zFb~(8590Cb?5Cm*nbFfk3<;w`FlG9w4(6`1w9V}rnBgwkGARPVH4O+ z|8^W0q=K}x%V)C@ycm>pVCqVvUT7%suT?f}Ossyb;BWx6o_3L=7B_xg^}@xbW_hiK z%9T+r@Iyqb(Nsdd^`h1`dVj%_WCQIectPMQL(~=0xscnc%w{Nz6=?erV2g24SU8X) zfsZ9g6uEYh=TbBqNxXsNh&{CR@GgAC2d0O$A?32iw)rKfot3usVyV$gz>I~NHWo9D zQrVE$)Cky>r*CA14RDHjt8LbWeFI@!)mg8Uhha*HsAq;}7FNT*Xog+n#JSzO6T<@O z`(~oSlzIeYYnMy}r_WXU&)C2T-Wg)29{8HE&55U}7l_;=9L;OXC0FU@gnd6KJG+*D z@N%tjFpj=A>!DFF9;uOix8m5k^qv(Eb)?lQd3dOc7*4x{P(cDLZ>=}#6@~l|_E*UW zsthA4=O-?0FW5o=mps(LEVD%TnLg)}`C9pZVr;yWh284HoyXVE-n~hSRB<#_&nJKT zouMJ2Zsb2qM^nj|%R*DlT7I;rtm}!wB4-_P$Frp*)^K>=P>Xk9BTv(@ zsjDVw#7PFYPgCgC2bN2x+%UA@p*;5O5p8H={kd!3qU*^;87igT>; z#_`WeRAluJ<3AV7iERz)r}2ZQ+RHgB_H<)fty#-h#NmC#99z8oI`DYbcq)tCCD$m1 zgYy0pww@*5`++9J8Vg~3@&{JZ%`-|d?>>j2B*X6GQP6SpITX=Ee~QCC%p<=0fz`YZ zu;1Vj&=0G1ykoq*cDm;ONs|WIT8_{McWsHIc`|}<=i1EJ;96@qe6Ma_e^q=O?Krd9 z5tSl-*R+NYr|T7aql+hXXuLYdAuYFO@#P(c!qUpTywr&_6IejiloE{4oT`e_n(gBO zLspsn*IWf2)D{6GwNCBAn5Aj?<_y|KsZy%eYNDVaU(oi|410D2ZCwLOzd;d~K3VOr zq|s*%-Iqc36zPs=>u9K37?=Z}x4>p3_i%TZLOd+^ts zb&NVQd^r*7zArC zB2e6l_akT(#O(26b*z88I(4;=el&gx%um$5@Ko*7_gKJS-)F-bm7u7eNNU{;^zXc3 zt=brR-$o1oJV3+0pl^oi#0HvX)Yb-n;BDnC_cHQNgWd$^XFuC)q2nVy#+rSyebk@F zss}O?jW~=?Co;qGtRr$AjE`5N7 zy1PMow|+D{1A5yPFO4lEQ0Wa+TMR!t6BI;^!1d)1 ziOO7GDvf?o>m6*Qfaj{t%=2Q7OW$4My~@`pAERtWZq|SwMbA1x zGn^5)REi?4grUJgTiAnsz^qc_6<)NNPp;{Jq8uo|VW^JWE+8;5PFPI-=>awq>v{j} zVXj8FH`3P~+lnmm(C$CY68ysFi_24Sdcob6cD*(j4gaMhnXMq5d*!{}t^JFw{p-hM z!!QyH=}d&y)Q??JiwzSt=GC*dJ*2C;7e2MT?VuvLGVAoMX8rY^s*((&IVzO>>9Dx< z)(?8Kz2Ki?g;%9MaN#%D318Uw} zTvaQLOy7N(U3o?W2XY(JV_UU`-}?ld&)USA6rSW;Tq=wW45;z3FmG;ytKA%~?A=hs zL4hk}is}wpu=Mk_(c`45XFs7C&Ir&<8ms^>;pw2zrg+c~nAMeCGFokcE3YvF*@}0Rw&$Zf z3kdK&>?SzhAMhrj!MSj97Msa z;$q8Vz@Xa%zojBg^xoYjz+H^6dN!%mn(dJv8vo5?oLCQKnNxbFamC?LeFR;AM1N@cWUgf+gI zGSZt4f9U%9(yO2B(mR4^d)zpt-3NaFz+d7$(8}Gj8Hz3W|62UZkz$ zg^bevwG$9X zfk4KS7*W*)PGKaJy`{&pA@E55C{(DuU@zO~d6?jUkc}-cqrMKx_z(wW6%xA`;X&wv zhEGIB|I5Ay=AhC0neUgb zD^4pwB4lZE4Y&z_@+=O*c0pvjP@qki_hpEvxk_(W0e>=tKsQp)nvbcOH1adYQCGdy zunw;dG_T%&4}*BDcvb~KP5GCaKYDCheIL&G%DY&*g?@~eS={@X}+k>^Zl1C-Z$ zP*u}t!tvw0z1xpP-$BF|H`ExS>x1=3CSy`Hs0FC++^N_^TV~w zcKLcGTCjn!9j!}w@o!}QKp)AnNTr$LcaKt23Up`vA)hGn_-cF~gFa@&evNm6w+$Qj zPXZrKQ@W%Fl~(h17*O!m?!-R8d%#1WS9ymp8`;nUISp1=9^WisN<`zY{I@IBgGu(N z`UO^1>de%Gk?X4tedOlb;KQ}F;edVPB`x;W!T`l{bX1eR^BeWZK=8Q)ZlTS+MJOGG zs@7@2A;Ksn+}6C7kn*}uRCreJ)M&x^5lx2wJ*R0!_w{pN#3wkPArtOi(~??WjIvb4SrNSgoomiUM_8n#Sx%P`XD4TfcHWs55VkB0Z5^^ zYAG@^L|&8ZHCy%x>=HP2p-vf8N%=vI;|4&k;1;@y{Rjekm^M1^yfD$O_nAL5@a~zk z>xIczvMr?;9x(NVUDdsP{o&D7&0X?{Nj5#u9;{PG-4oo`%!R^i3$Lj^3IUH?L|SJY z_OblIM_W{Sd|(Ya?ZCfN3!5z}X(cXGUhJhKJSE2~11l`%aP^%HK&FOiXx^sCY&D;atw{#8e55%#cr{ z)(_L*OLI>ZbRDDb*0O4!3?)4APb&c;A``gwl3x8R4T1N;w)A~$)ryJXS#!oYS#>8H%!sP5;md|38a9Y zzv(M&aE;>W<>vPxg@L1*qPv49L&H5Enh9B z%J&f<_M6C<4Y%l@F5qCrd;lSKa}C1SA~-^2)vZ^OZ&A|%v7W#gUUnKQTZgQz3Bv8t zCcPp`F1H0Z)7@K?2r6RaKy-9~sEC;)WNh;?q06=5t0AWt^a zGOym^1->^t_{L#?6m${{PRyM2QcfY5<-DC(1O>6*?AI(^&w4yl1}CQ8&nW{Xb}>QF z&^eGriv;Zt;+^VQ^^geeNL%COH$O5>5FcTG>k7An6Fbg5ZwpS_+DK&nyhjA!QEboI zRBJL147+b^qHI+%gpm&mWKY{*=ip*8`q4;SSWcaX73JA&T>8j5Hwv@t-&&bonC zR)}4yRfNsn47m>fvD8^~LkxW*t&)2@h=+c8zhu^Wok(t}GGSj(o&Vv_Y{8-4@~&pw z*rz*;%0>ZQ*yu4R7L&(#GEPHbS#3AaVJ$*U( zKaVV}Bs-P};vnJ7A7buT;;|oDxV*f2|NR3prv4>uVbjFAT|UNYzilZ& zLBQQ=)%bvFEsh^_CPU*kQemqSraQz#wtfb;S1ILa0V}}J!+~tr z7@HO*Z3lffJdZpYS!R_cvy><9(=dcx_1-(nzc%#E=y8g{{qEIcjydf7T+vtc!((Hk zL!;m@K^A9q)@%9qq0ZF~jF0=MY5EJTVm|Rn`KhH_R|H|RC9V=#)G2#Z#2hz!gk;#8UdDk2!dzzh4Knu)-w_O*0I# za%{o4L@5iq9YQuj#V|ZfH&DLq`smGybJS`Qea~a(8as_jqsYkbbaYN$oE?ZmsZ#ux z8@jYB3S^Mv)$R@xX30x{%e?BtTQ9tv`n4zLFl6B6{$RsuvAG0msl#}^S5Te5YXJ(0jfv3L7SzM$dHmw@@> zL{Ed|kmEB50?#WJw=H<7E>u;t2GC6iB^)!^)o&_D#8yIpA1B$H^s~u;`3FOSOhy%9 z;e-et>DD5n0PfX-i=30knaW^ez^3{!1}{2c6iN{TL=gK4tZxfAK*_KzylrlSGC4*e4CygMBjs-jy6Z{p#aT)P~n5r-FXZF+MPwH zbfAAoXNwd|rM+5pOww%jL#_6|G4lBp+oi^)okPA;)bEoK{_OB-Lu>loC0n}GDFj4U zbqhJs8HPytP0P_7FZ|*e@htHS)RVnsTyjNEaMb;r3`JU#!=83?M%x z{UNgd45Bw-7juORi_?dBAB#t3M06BxiWl7nNiO9IBj6W{_37{mGT@+Ti?WtAFa)kx z)}O1xHXM3zB2sm7cBFF~=mzIjxu#(Vj$Foo#Jw*^zfS+}$t(z=zNu5jQiWK?{`t_G z2bbL!O4V=j;gIn;`2K7B2mJW83SW!|4W~10$Dbt95I8XkxK+R@aNls3NktM)2FHFu zsRym$UzVM{jJHwg72jjbDT?P&h6+BGAi%rJPAQQB;r)uh6IS28D9_^-<#dy~FxGh0 z?xx0uA5L-Le(?@UylL98GxEg`oSIQuMIYz~{aN4I^H{w9L2^ouvrbz6+ARMKOl%Pk z(5M{v0XPA}Cb|)^0Nm>Y>I)L9Rj6p+6WH-9MCS6O>*u^c;6O;e9`JlvakTJjO-B1=@u?%i=DOf zpH|}~e6*b8!OP7z=s;mFE@~^LAkZ3)-`G`wbT4<%Sv=v_5Ov>h9V+~$@QJ0c7jte8 zduU)>0q{v!E~pH7w)8geAl`R@zv*TO^9OXezKpkQzI!bO1dz+Nkl^hP0a^zR3L#l~ zfe5}^x;`C`)Sa|wZW8lH(InE`*t=sqMgvY+c5b7(q+L{jH+LndJ3T;hF21lvYxy)i z!~o6M83-|^0_EBeoH}SN#nx68AkO^`SX6ro>~9n@Z^y@Hz=dWn+*yR*UmlNNgtwy) zx$*<1QN;03ha~+Y9lWvsMh8qG!oTr{i`Fn4c=;|D5TVX0hJF&WLuMyX}o zTu7r61w#F+uiD<)5*Dk|m$!RH2{;?#v68 zNuf1+!Zy_9mpE3pmX4DAh9>{^8ctt|e^6kT<>sF|>_?F3`>Q%n78}+g`FbG}L$x-B zKxBuqwA-eB~%o*&a#jZ^^x-oJ*MOa+F{&x~sD{L*_ue}(2t`CUx0 z9r8NFjxx1b^z7v4dd9%?eV;N4sFj#*(GDufvJAN~kE)i^~jvNHI$HzY1TyB1OKQ+f7B9oy{>A_YNrPuPC(LakEU;014JhwBJ`Hv_@nixW63au-TeHtr1bKx)F(IK4Aq%X+PX;_uZ zxx1<NT2! z7Ob)3HjU;ag#+37>0z;57$TAjLSNI5MbA(rVg#x-kINGHa z>~;6W`u8t9cVvIomDW;C<72cLIYYuDpYx9MfGl$=5<#@%H7{DMzzV#H6<85nR^}$P zt(s*Df{MI`Zdq;yI@s+H6weDhANDFfW2;H-uLKM(VmXX4c@~({*6}fF%L-2VLk|6m zg4AVRyb6Jk|I7&lJ~`B6dZ_T+;_pq!#Vk{;NL|6_>76g?>Gvnk89C8kAvZe%6+ z%&m~#At0ZDRl$0-RV_&?(DMu=6f{K<4HLeoaSUNX*9G3hDrzJf8kt@R7+NJhoh_f= zdkIU1RSc@_=%FiHF=7Q2T9JUMOp?9b*9WY_0f)xdUph#%kCBuO2K-8Zw}gCVR%lI= z@GY>CRLAGz!C#m1fY+uCnIv(V5#~e#s0<{PB5LfZeObs>OQI@BJi~}36ciN_rh=B` z_fOE0dWV%mdxRpF2!sHlcQy;?SMj1x5*K7bp|GN!Ki)>}Xp1E_ZuxqGtZC zSS+z8bIB7uv^IC@)2{wmX_~`))yaEL^bZVpUofwPC(dfk#?pNM=_s5ryM$ec$O2FD zLZv)BQg6>~J~NVyU)B6Q_Ie|8NdckygS#@GsByiY>y$3sJ>q4UHs!<8*7FzR32aHL zC>pIz=OX9u*qlE7YBXQPK3uOm*b))ah*5X-01v#m9CytRk7S~o^_7(*29qW^nPZ+Q zXf0mN63O9UW{bXbWS(C=*5p@NpAal$MEnei*;;Qk!dUCTvZO)UE6Y~7e)=_YGs-Sx zST4fX{Av@?TcjI`>2N5jMu|*Sfh6HvVe}(~o~~5RN61EE70V8m%DtYAwcaOoJ)S9`B4{~rr`@&Sc_kBrJ@Buow zWUPbdU|Kh}#%&n6ChZ^qDeL7&V03N)|6hoAv4hpoz#|K0#p6I3-*VLC!&$^1!X3!uOAq+?= zT*f@guCk%$W7G&3LAk_3FtajmdG($8_b^Larc3sZ$5=67sSk;92knpNz>LVko8I<5 zptxGBs2WBGY6nHn`~q+XFM#&9zxddCDyYT=OuvvAGWwj0AFG{k&Rj!&YBx-p&9xK9 zGXc_vF3K-1S#pWjdlN}-36lcth$m>$rWn&32@PZW zR-}o8<(facNARI>u=hU#Z|t%JMG zPQ(X5rVgaR@!1yQWkwLxRtzsw=lk&s}?;zbdzk`%>aWN-C)qqs8{MHU1G zYss{IDZ3Zoe)DZ%5^tqvUm6x&-7MUf-HDCB$}?m!QNh$U58>y^_q;JIHPqMeHnSBt zE<7lx3JNl};yy}T7TcQZr`C7#j^9O%t+<_X&O;9CJ~N)WsuHLQ6+;K0!Yq_1D)j;N zto|6hLCO2r5XE+UCGRBq@;|^3e2*2nb|p|yz=(Z*fY!<`$HMxSE?Nb4mrtZ^p=)o6 z=kAk}0=|0-yX-Ef$iVCtOO147fM&tY?>n&Uu#713eW&dRN;HDKoe*C(Vn8?vgb$dX zSUK+=%BIH3?zUJ;q^P1GFi6`uVw#2^r(78UhmaaV(!T{qeeBx>gyC`$yWxIR4M^h| z?qx;zq$35fYIR(;C};vn5#$BuMx{w7MFuA%q|IQ&7@@91xMf6Byb8^591Vss8a6qbOFH6dK0d&j3AWzNIppT2 zmn4lFB12J4p&6{C)b?g&@O#^)Y;9E}wcgHVmn~1x5=C6h!!G0;G>B#VqO-J;QTdg} ze>nd|ZD&sbmS<22)+cI0oR}gmtA~IIM;raUl|&g| zNX_VE_s))CJF~W(%-9jjZh4iJyU*;&>j2v>^fLL~@Nn=b{YJ|&s@jTz&U3; zE%EYEZU8OIK;=npl(@nO$wM6i%QtA+6IJXF;xEWg8z{{hqxBB4NAde$g>Fry+ks&}=wv*kp(b<}7eh%01i zv{gq2xWJp>#RybNF zieq+g%_hz^YuIR&aaxf^lV^ZsvA9ps-2IEgFn10)O^XzrO&d^(7WUt%r_2nOb)o8( z9nuTD7rkr;i{{eLeR)Cf9wUGSHBG^@@rM4bPU@ri#vX}mE1{=oAnX(uRz|kB>F?&} zCe|G?qY3Rz9z4xLJ^cpwD!8tChzExd@=hnsD*+4xfjU7J)RI5jQTdA^C zDvbj^8jf1dT!0`-l_C`3S?w_wsd|Cnlo7j2*Pptsw1Q984&wXmATd!`M&|8Den>4t zLFOr%vn(*LicmYtM6{$ar|S;zPG2Hlg7mX#T$>!?LDSyI@;oHt`CMuOe zwzXn>IxDnMf6jdYmJdN?W3a<|CBSJ-Dfj{r&wXovVtur!cxlCp5sV`P&Ez54|t%-Uqh#TD86rG))z~r zYx~!8xdqSmY!D-K$`oBKBJ|!0HtteZXzr#_Ca^7u zMf1l{)^)$F4Er}KS?^bgn{}e;+n*B!3`;ZEpBmQ}rH! ztYtw7ZPLgtZWW`-_;2@JibSJB+xXBX=X_gYP6)y^{-MDSLb>QyM%o{+$%L>mf`i}Q z$qRmERPYS|vPR#`y}tcnK~XlyGk-+i{>nhd4WJe+adD+vvJOb>#!?GCPe$WIdE0F( zsu-C-fEImhD`*dMqN{Z6qh$y`bs+rlhm-tRDr9JFQ9=eY_yZ^s_!`CqNug|BW!b@W zIr?y|co(Z6blO@O<^(lO=WY#9kDAx)(B=1|;KiG^?NurrDD8jm-Iv!CM*hx$jefSh z{oUiu7nv5X2`pu>&zmU>2ZgK9_=`8R;k>?bLy(VJkHDB6jwYbH?RRM&(j`T#mk2MN|;OOEFNsxYG{ zx*%9G|A5>P4!9NBb_bMr%c^?6x^zqY?pWeC4*dfeBlF4%?|-1jfMl!Z=JNQmtlVA7 zunpaL<7-n1?PvE^FVU}wzI)&Xd@N6NHzAE zz%I_`Ib*Km*v}ajiwn3MUzmnH$0nZWb2vp#!!Om_z>A^*@S3~sEWQ;J!u3M-*uut1 zltiGT0JH%{Vvu<}dhrlixlLUWG=f3)G2wz724fFpLkn({PhNfzg_GI0VmbFp30TRO z0K7X%0ZDJ*_aVrbsY30mYA#9qcFrCNTQ?e?2TAMppn0I#G$bZfvV`I`u&nFQ{O&19{$&r5mtV~}3pt)aO- ze-lBAcFZqnGGeCc$x`CPF@w>34>R z4H?0OLhC+ToK(SU&iG6E@u(pc4UtELh^Y8kr-TSY_&w*rZ+<&>Tn!uEb5`qyefOOj zo!g!7BTBhay2&*=en^MIBqV&YAV;Y~U#QMe+K%ozRwrLrdc*o!XAOBej2l3H8W0N% z?3!mM+D^r38xr!<1NwCsq~(6V1o{=;I-_y`g?_?W_TlN;YXg{lAQEEsxlZaqbucGP zh=m@?;fQ4asu(8I@#jM};FM^ILSc;0=0srdBM|_=uj@9N>m(!K@}A+?zCvVxrJEQp z_iwrLAlx+WtI{B@HhyCZj-B_{9JyJ%R#VJdl+=%Hi@k)_jZNA{$o2BVzXTxrZ`Yyl zS0ooI3hnU(hQM%f>a&q)8txtEZNN16pL%k^rv-rVtD3&)wj(CdwBt7u9W7)~MZc@2 z{ca9NsKpE_)&DXK#~Fp&p&)Zb*(kU7q<-!eEo@IAzQL<)PlgxlhdH;0gZuvd5Nq-NYhQb_X&A1sy8o!OL^-B#j;U)a|mg(6!Z zA=hc;@3d5N_&%CvxEpzm>O<&nJTlYp!*I>A(rbBYRaS~|M&LM?|5k*Mm?|GJ#ArjN zpratOd*qp;J%7w&TmSd7-CI0-;j>`DH$UjbJfN&C*N=X|1!Kq-`8Wx*Vqmtw&uVqa z;M_cjaFj5cVv^)b|8ekQB~t)U@jgf)i!#gzoA#}W%MD4?1xEdp;_^!PslHdrsa#Kp zQ9G=qPrvo8YAc~cuz!0ysN(a7ap||Sae$88H~?R;w4_t!u%JwJ!t8b_V3gs9OFvCe z`1Q*(=6}dv_+81s%x=^077hwMkGaoPA4GVc%KhP7|paSp5x_sB%+-Uw~-t! zfI1XF=e%`!Pn(ye#*KI3Tl$}Ja$BObh(gLd#zk&asRk`<-DIyvnX)K3VwsMi3zuXV zo`nfP(#-3F*D1n+;06$au_|>YEYWXL1dApkn;FgDrw7xh#Xr`0_yOD_ymbz)dIj)g zWKW-o4m8(xm-AAgK@+Z>F@Nx_|e!N~LUH+;{fE@-NRZ3DVbo`-G|B zxz_Z1dvKr2#VRHGdq{nPlhTt2tSKAluIZ$jGC!q@`bZiBcw$XrS>p~!$Mh7Dtiua4 zVYZbF5Tho_tVRGW(Z)^WH$KCg@na5jCH1Fc`ch!nLeph@WrPKz}&oH6n3+c1Wqf9wM z5&+G6K7UN4t{b?83BjhYc~%P}(cZPRGDHZhx@-xQids@!@WV6-0m$e$$DvO77`DK%)uT+Y6n%u{9A4n3$$-2CubPk1v-Y?S7QAs{7hckcb?6v~CV=4( zO)t(-U#Vd^X5VI+G-IF;AuT7!X;WCoz-30zP(+IzGCjeCHupSy>Co)plAX|SI$!vy zdHA9iH2IBNMh+(X+w-KU49{G-qL=a`e4bT0`{}(2J9akljckqn=ml8jprt)UXvquC}PIrx-D#&vS7RVpMbrZ zDnHrX!WUUvoZm9`u$SIBdf32Bio#gpKmCX23!WRUT7L7#D-LuRt3{mt> zTYVcuCx9RXs22gLuZFPXv2Q@9b z@BM^Iy%w=<27&<(X@?i;=eUY?V#qdBcx7TDIgOz64d_Ry;%#ekLuXElO*`I-TdUnd zdpsJMj78}#6_S{=pR{;SJ5zHfxAKKQ->X%VJy+1}aNPbBz!Zt?!S-WQ?>YtjiU)SA zRcA;V_tC)HkwD43$s0+v%$e?$qdd5#4`W5};~M#tD8Mgq=GuwqH#|^EtzS$s1JGh~ zhE7H_K@^PJNA8nuM{U&#F0(3wd}CzeZUN^Z_&qgPZS4sTdkSHrQ0!4L1d&+Xt*S=O?TV29T{D8qp z?peWAS1A*uoFS@Hw>p_*?Dm}&c;s*@W~cr;0+PAZC5))Vl5|x>LKEbPB+d($PGU@0bhNFvILW0|1JWi4cG5fEhfI;5*A z{r{E+^eRE?qM7z7+&|-Tkd6K8+Mji@5gbOY<=#JI7y*NRavfu^*FEb$rAp-LUz;l3 z)P#x73HPMB4$E3t^ESvw2^=L6AS*Ak+6S&@7tvZX-~)`@bh1{o!LI)1ucwG0)G!_- z-}5ruwHZ-2G$b>Gm^(RKwZ$V>mpWmU1@yXS$C$p$UBL$vHATaG^J6yy8n0Ma%*(HC z?%W_n_amK0&hkvxBF`p*mv0Q*a;qty_xX=uv)kr6o6+%R(gLqI;)9v|Atkpd+-Vu5 z#4ul7nkL{mTRN}k|Cc+Ur%%6>>WL#lhNTLv7ah+*6yLHGlYB^;w-nB{toXy{sDC1Z zi38p<<3Z6~1Scz(MF8u^2I01Z95O(gs6wf!fq)az#IVyN2ysK2B`n(*C9X>c;5!BF zj6KD~K$qz_tdS8WQN|4FHjN+_tZ|*NcmW5#NeS~`iIH=(--rN4CL$S=y9N%{T9&<46f9zFI+F} znZ1_F6>{mZ^P`tG;=!s=O3@J^nc1e|RvLM6bLcuz1%%ORH-g6{s~?y zvi?Mw)s_%|<@E}F@%;!er+r+Y)Cn9EnWe4-`TfScoV~-K1+i=+*A}M9)ty;mZW0J+ zeV?qQ`)vQx?G4+bOmbq{Y8jIUj@{ppUWjL`nd@2?cCNHadpp@IUGyw_Z$_qkbPcfJ z%6hS!x$yIx32HPy?UY;hhPeK&rC3hJ(nvsQkPXQ&F*oF@!#@v)j@d{h!|^i+5M{OM zl2ox8UEDJ(!^0bdxC+>GQ&c_mUV>#R!qBRaL{M->-Kh-<^U zg~WG#gSNn?q)GGka-~e2dh=WBg{xm2cus-DkDAR!YE#3`FT1*218}Sqb_+TlqEW;I z8~gVR8&g5)C)Jj&HC8B~PE% z&MVzErukPiT0J?7BSHTrs#20ztZVZeWY~qlA9BRtS{CSe?YXRj4DGEY9ho;lxm_t{ z3M$IcDx& z%m1OBA*`vj%d2ZHKBwW3qCJF$r9V^0may|S3k2~#?=KUu27oCeXUVAjY77EMU(=!v z%I-1Rae!`7 zwborPfw35}BgwPGEZ*9&MjX68~K zva5)moB*h{`9#}Frm-n}D4%(O$&vY1g>A~=#2oxG?1d9Ag?1AT!SOm)($u}MnTf$UC*^Kq_VZz9| zBuqyKZTS#?7w;h7@j`vF_dJHtyXx_NC|sw0mz#v`<0^es?NX1nN}Z~GjJ93MG_HUNG~5 zApIhDZ-z0*XgoUFS*E`y1FWjfZ)HgayrO&Ckvvmp^oQf$P+NNL?!9;4UDptk8Xv$} zS$Jb7SHBPUSUGKXoR@@YF!U=9&}pr}YJb1j0QF3mfko`sOFF>gpph2|A)~q}Cg=o> z6u{8tcjpa>(J03!&7QUQ<=<-CHwou89XGLQU*WqMmk;y15FIW6O^BM1xrB~zh8_B> zsQ4IT5_})r3tNP!2NB%@p^0vdqH_sNlEk%*!C;AnyJxKPYZWz(1hB%0YZ=B=!7)Zi zhl(P2rpXH_ZY3kq_*}=ALgRqI*#0^!IV%mI&(d=-Z_H*28Z7-}@U@-FrS_(}H;PZs zp3$oPzy^2YK%7@iuk)?^LkaMu$!QxJ^$oo;`{n}i9K3NwSzA@>8GrNcJumnMva%Ql zSBFDQ&|+!V@n+MZ={{s>wo292b=cf?Q3G+D~k9WzT4bHEY>8qL2%ul<~VGQ!ZZ!Qf~T@Yo(J4+ zO57zwB@sN=Wz>^f2{SU>(&hOIP||DXg$y}Q7mrWJj24mwHre`xLwYp)&HP^~&ntLoPxR4HPlwLk-wHZoHOwzEP|tv+!_u-FDAP_c`6;s;>q)gmNUbX3 zhVDRa={T;wE^j}&#aF7B%o}UE7Y8ZTjVX*Wb|xkpLmW@K9sFSNvfL%Ehj-0pdmjgc zp2klPleor_JZBC}6CE)uYMu5>9^KhY*$%9PsTR$dblw>2U#K{`>iFOil-EjiQjz(q zN^-B@32daJo|#z>OUiAae4QNeQ)VLyj;a+tpOsQ%G8yTp7fAeMmIV9CKtHlkFIH@N zh!sH>G~i&YyG|t8(_pFyEiEy&;{(x%c(G^g3g!0ayJYQlT>ppI2VFfCq!x1oAgQ54 zyylYt`FfQ^X2%{mSns}OlCZTVPLQhqX?4u)$vad+ESAKP}pU3_im`>`*4 z@cW*jtw~LrBti1*XVJ%l&&k<^fpfWm%W$#h9-J7)tDG1IiKS@exZf>4S5u6(#vXzb zN8N7WnS5_;S9y4j{9^kDr*4;4^Vtoto9w-bo0+?fE*y7BV>efp;vcOo41Cy|Fc=aV z;rkH4DyKr}*Unkl@oE4HitrK5>b;2*^5#g-s8tUID0kbr11Mq)&yjiMRcVo1LbjHa zEi+GQ(w46yjwG-tVOo)a4Oau@C_xMyX2MU#h#=@%j`)5kgd;)Z(1g_+Je#Igyjk)( zN+B8;n+OIzGq4@|o&(Led+N)IUDMn#uoo;41;Dm+19*K{0a&!h0S~I^o0kuoHu=<` z2q|(=_m`1E7~=-)L<{i8CQWG{Cb{NH3Q*9Ma{hfde(x$?9OtRkfimuG$8RK}hZTrp z_c9ihR{vvJL4lN^#=68H3AP4V7xj|h)G|;e95&n6kalezHx_Rd;)NF~C~HBz=HK~! z|5qO=aAN`b;C#c`yR`$qDzNw7%1pg_5C&(4((40d!tqeP5`a-02kC8bL)@`Nuw1SwCv1{8onGPj`A^t zE!xMf9>bWrJ`=!<#GY)u)^6cT^Hx9a6er%@&0QVXbRmmWXbh(Wq z-qV5Ire4uawE`ULIwst*bfbk9`oAQRT5CRAtbAlZUQhJe4oPqpB^;kX5W70A4Hgp| zZc9+pH>l#Bf5Wdbx*kT~7_P7>z{rmrq^G7?SL(<=CID}0*kN4k8?FLbp=9=r4cmI2 zIlv!iztjGrHzc##j!JZAs%crgmGe^e@k*)d+~M6Z%|&xZpBYxe@C&!Eu_mfYfAd_U zIQHjVvSM>GELp#M54aPf>ccF3=RuPk@+ls@|RH1Fa4&f|5= z<>qy5fPrDdQYG&P9s!*|_c}0{NTk!OSx0IK;OXsmntLtWZe3fMRm1(gA@%NwC4PSV zM1?%6&(Z(7EpqrXp z8qZqTSyp3Adl-77$46$mVC5z_-qGT&082o$ztJp7Q{nyCoN5r+J^l)m@g?uIwN5*d z8*mUwN}l_7#A`n_{2%ARix<%uoLel6%ez$q%P$k(ih;9lj6Y}E?M$o~pIb9z*)#>n z6lRDDe}b$jT*ZF1ZOb%5w@=+?D=S&iC2VJqdu|G(lgKVpiOvJDgibQnKn`1{ONCB( z1bcxPXiZPI<>jP*MDy?Tg%`fQi-`j!gw(Q+E^V9Bd!Do8sy!9@wf&cI%U6o)!HO9* zj}C0W!J7l7z&o;njGju1Bd9`kmDV$HF@stpjYdLYciLkY`m0%YcYHOS@0bh3Jb zi5^Se>P-+pPQTcOa&P?Qfw>a{XRCa2XEf`6aXs}F{8{FuK5QN1mUqIA)u^V#d_auO zKl1*<#orj4*ZAjqMwprv06*Xm(x+(0DL(8C?3Xdb-9MAs4J&lYvGcR5aF0OZB{@>~ z$(B&6O0+*Q3+J7PH9IhUz3r756?ta++R|wC1`|D&zSVmXO55tS*6*yZ#oFhO0k;`f zdV1oGv){j<^D=rGV#KoE;jRD90PaOD7O-IkkX9}^jl5?H@mb#q@R z>)VPa742963=-7{5+e~2S?IfzoNOh%Vxk=|B@nYwNyl73e?WYKMxuVw=- zOn%&U_}TEc-fq?v8r|QJDU*CE{LiPyGTH>Ve zFkV2eEp-RZQ0Z{9CUi9@?nj5v3SVsIahT_kpK&FiM;Xa)g-74|(V1H;rF*Ts-Sg zPHE{)pZ$7Q8K+jF<%g?k>O7Swuh>xZF&G7D7NkyDue&1yGXYwf(iiO6yZQAnhB5dc zUlO<8(eHnED<7GSRD00S?EK~X?Em(MXVfB}ALhp@&RjPS-7>%F%GB3Z(K(Bku%y|i zG)hzzHyeebY>B+l=uQ@6yA;++w8dB<(7XAGFh-h2T`OLnV8&z+9apK>Y@nz21Nr^#03P(>B8XuzQX1O%u=S??WBlSoL$0nmTBuKHHtXltup>)^- zOWrIUc{ciHTFl}l@7mdyIl{ggdVsX1)1KaVaH13kqoMKd^jrAVNO#^OgIQktB^@Yo zdm;(HNWb}Qet1@*k|ezc|6f3uf{(xg$s^OuD?*PC0_E8t0hgOd0a2j4W&}lX-R24y zT2&CP=r@;z!xhIp;kbU)XKnozXJ7}zaww6(c5N#m1Azkg2!Le!YvHd~M|AVr@0|Fe z{xz3vS`LHEsLAVd1K`aTP?+cIWnsQ(x-AimCd= z=iksDitKc>9#13C6LnHvaZo%)R@!e4>A#lTC9Z@r?pka3OYT05Vwd zKN>t;t4*M}hkC}?EgCDJ8RI}k;0YQKE>aNj2p0YGV$k-yL9i(kql!6zEWjZw4iF!X zE>sP0aDD-*`m?0sxqtg%vHKIn_y9H4zqBprh-pYxkv(hAJQ{?LvXS~ZK*cZ&hXk4= zhMEdOYkO{#_K=w-mjJINL5G3R7V@MYUOD;Y>Xs{yVkO~&;5mY4h$NZ6&w2~HW8Bj? ze25P~x{zE6tdm5j5)Ud2MCKTx?M55~U!r+tlBj@XIKD{>gvt1FZgk z*1tY>^5|Wumk+0U!bx?ZgeDhwijDv7ar|HR9ar}J!I&kO=f~>-12O7XR zWM3RAnth%#)Bra&Hu$fE-%Y2f{;9FMcAoFM`pLg|wEy*>GoBUUfjivtWGNnTS5pN? zK9hZ!0zqt1A9}J6yZy}FSBUo5&n4}3r8#Gk{1%(@tQk_k@`7dM+3A0sb_le~&QQ{n4ld zrS(@=4quqJzG}3?Jh6Iyy&gIOr0>cA;vuNf$#_B2Bv$P6@-5f4XzcUAv^F3Vim^_I zec~L|zVO&?tPie|_{hnLZ#-}(_9B#Dn;>XNgcTUT)rMDZyTS>?!R#MPporSmt|3_L& zEVR2jn^_02xG4p`St!Q{%OF?{1Cti`_F~XHs9XJt^}@QG&b$Il7+m5MgjkUEU%jK3 z`EmjkbL!jf{l}~Iz1Ex?rZmrNHjC-QZtazO1M)1BKcxzAiBo92iCm0{97AjFWmi~L zEeFssZc0har^4z1&Kn55Mo*8M>zTo{?LNv!%uH5S{isz7{c6-xuS*Ajoxz9|en8-E z*{-oAy!r#THLupn#B=4HA4^zf*p1RxMoZ~vRgK0|sdyB42Ejtpv9ucfk9aU%&CY;G zdrsRj)fNf>uPz8&tmX-(%aAGAudHzIK9(eNw^S;Z2T{aUp)ifAR7y8oKR+W{E|b$p zm|63Jc7zBdYBexnP!ky!6fdaYbXB$Y>wyulvo7Bq>!!^sXPwnH_3`fEp>J}@PbF{q z2i#VA#4U3CSMkA0{lXdVtS`Z>L(l|x0N#TaF#5(uorM#E&QFlk$<->#KilfZorXH3 zJ?wflItaaWVD&hoh#dk{)fAXz#)Wu=1YuVUnCO6D-5__(dH_S|cd?}kV7)Xm`Eh$E zgwMWL;l3ZtNe9k2wPB|0&YSP;?AORHxb%K0KiKNOvycv}j<`D>b}}X{vey_5hOY-}iH&HoJ7NS73VL_2mCt(Uo^|jAo>OT58wz9M~D#lLv?Sb0-?+cKmfBr5iV*yA+ws! zd~)*3bE5kft~No)EHYa!Uz)i8bmCuLIm9~$d;uibe0(D?5C{<|L?ec@uJF29e&4e7=kr(&G{}qRiGgRb{ zs7u%>eMM&R=i?+?l{o)G?Ii!X)TjT;tU)N-v5hCJVWWUXgGnw~q1vRmECZmhG6V6Q z(*Qx<7t?6?Gl%IvPRC0(A9(g9NLb^Qh1z9VObyWMaENy47jK_Ac!|S(n@`AJU-7VR z{#v1xI|vp}&L5_vWRz-rjIYp85R%M03`m|LC4K|Fq8H(WU2io$j$m{O-o?1= z8^}Z8O_~VL%@24!!(;ul#n1hlaoP25M`Ly^o0AF1`kP^(e!x}0CIM>NK&XLY8#K)~ z9X-1OarhoHPMWdSj)Ew#ATkeC4JKOL_Zr(ok_)TLO6WFc<;Svbg zpecu>u!#`E(TL(=eJ|2ce*#pAaE{19EJV(ZBh`&ii|kpEAIt_+0aDe(LC&CcD7BZS zEKl^Yum4QBdc`s9BG|O&zj$_Hae8WMGX14drIHe*i#^Aq^1azYx!SBWC*&rvt!5|C zO6}c0Gv7EDP?M?ueW>|0J2xAO<6xZ~6R86=i|iS_3bEq<-j>3-`Y$RIyb8IqBNrLa zvdI2rzsP$??OcJ&s8_15L%mt}03?vSk``tMrITs>tpN;kqggIn{T>uh6*iHGF z*I#wBjq1F7eX_N6d}>p-b#{Dm{G+yTD1$(Ujs&<9n0Kccj~Kahxls5*e_vlgAxMMq zG_KJ@s{*mMP}wNxqfXxPwfoRCTw{{sCL~;F^M89@TT)aWV7TGdus% zQg?nhu;Of6eYSP9pn{UBBLm0nNuCAjf4}*fBVp_UHDJz*KMjvv+*&kNwP5o;z53kA z9u;IMJU`^mb^#VWleW)m-vuN19ie&%wDgq=UI+tLzK!bDDmbv%pR&mi05kzu+kkTAT*oxdY_e^R?i z^*%7Ss@2zb<9lU)q+`2uij~b+0w+65eOGXdj|tDHto2uVlO|_ z8h0Dz4!ZW%vDT9r-u`%cfcf(^!G9fMk&IBwC&LF{(fPx;Ph)}9^3%`M`ODR3i`--e z=U{#)aW8v)PIj~U%BG`zQOonZEn~X<51l1HspsDzYnSVe}sDGAO>-G#^lC9toud_4epM*)@MKzpzmC zT0&pd%zK_`uf?#$dKkRz7{e+k15a^DPL*vHxn~Lr!C$Ya)Pb((J*HGNpc&sOlYVDb z2;Cm~^U;>7c5!6Pe}TF!3A(m!#t97jSnoffx(~ahR9KStQA0M1i~k;2IfpHC!lvQS}R!M4I78X!|F{kIv>ZYUxE~ej&~`laU|$)<2#G@aS-nDY^)-bG>zfXaJ86{lxIi;OYq`nsbTyUcLmC zF-&Wi0Puv8{yt;`*dxG);BK&nx-5BC72r@qR!a2*MOkxr%ZXbWYV3y|iAO(hj8R5& zJeccR{pgudyNxG03>tF8vr*+eD+KG$OOqKLQBPB~*sK8hd5Z?*>C#hj11!for-B90^=V7ZR&L z37280#@5dbKBOnyFM|>ZE+YeEaCw1(c(owTW&2?Q2#JAaPS!px_km)-#|5oX(e)N} z$W`ot>LNQc(5snYo*u`i3P1wBq5S#}ntE3jS_{fTl=$nb;q2-vfuDJ$?hc6gk0?S3 zHumt6aY#3NvQdD}-O~Ipfe0z8M1ciRDC*Y@T?nz*(M_#lVj<|)TI;}j8@=hMQ|=Lv zQGzYuX3xg?kOQpqWax+}G@sa^ai)G>WcYidvWn&Fc>vii723Ci20f!aCV*>;g>KhN zj3&u)N9_)Mh3;mOpDkCbIk5u(`E;RPz2>e~;0lVWOWn2@ohYx!y!rwCXhS}QL!PaK zMyV+uTVZV5K@x?IWe93Tb%m#OGvH*|iEymQI*ld)nHAW2^W+{3WsM0ce1c!;;)+cJ zBeEwW5FW5s(KFsl|A0$zHJ*XfI9;`=9!bZ-&J)1xh9zoM$QI%4fC8a`zz#1{bcVjO4L5iV`bw+A`vzhR1C5^Z4%w)WKY5AHCbf$-GU05y9o_i2}LiB-! zB>wgBTX1_~&^8O`*GF{Gqip4wdOh%>Tyuc>`__t|Ctb9H$n7FMWmHaO@)@O;8YR#; zLaIT>szsj}P(+PpZ5*xiKvMS3#jCZKu*2m|%opRmJ<4Iyk-)h`IBr-%U`1|`LQnu= zgmog*nwJvl3dy@5#d;(6Xk4jkV=H8KL6PO1ky7bxwQd+awpaHxGBr`j9IN5(#&@S_{qPtuJr)? z*VV4qTE{}ItsSVZtcT|wnLlQn5_O?;2$4b~LL@V8x})&o2j+#nj5&vCB=g1d97Hjz zQt3ty@tV?xGz?)VOhc1hWG^KW0CmpTf4S#Mq@tXaJbb??`&kRoWnn6Xy8HDmEW8{REGoVg zyqidjO^-kZEweH(t;2*{`sKkGEl=VAc~E-!CU0eLAt1v2rY33h9}R)}u|MZEpsgcW z2sgkD7Z5n{_gw&|qK5*!@9`6HZeatwE*0q>8XB0|Xjbjlv)vVQ_5on&)-uIaYqT+` z0Js{|7V|F0(i0KWWL(nTC>4erjb3B$HVdK%p((~&4$v=c(j+OIkgkHn+zzNoZ6Wm* z)`-$HwgeD(>zkJg*LnV)B~Q;xSd8_XY()7H(Z1Y1`^M*sU_{;kdVsz{;&nNlBv*{h3IMpqN#CzJw4nUJ|>T zVfNi&o6J0u?vE9j282IE$Z-p-;A;r9PP|S2f!_^ih%_D&?J2I;&8O6w#gy3BcpUn+4@|e-&9e#hvsMOV(r@L+6DEW|3X}ZcO_}M%r>*jvr+nJ zn7!+|Im54;(E2^|>SSE?-(xbJJ3HGIG+ZS4$PIsh%_4nb9ZEoz?OM8-``tFoKd>9|; z9l*Z~EwT3E$2S?troMkf zkr7%%r7;0))7OfqQFu*$zzKmlKo~RRuH$1oG%=Pxy+{gE-RMn3VOwhPc20RWV)~vV zy~eny@4r`Hgt2PF>u?P`3?p&P(~eAMaA_c-%cPtzZs=m{)^g*Sr(*IULJ zUh~rvdfjV!pI)IKvVjtTC^;KAv}J91892iay|sgbc8HTGpHYAtu(7Pt;cfbZMQ5578+^A(r34M%T(8&AR77>L8t;1Tinkc%ir+`VVPm`K z?d@jcR2)qkT$kDonUP}c@;#lyrGZGwQR9aGhQNlJ9o5EHr<}6Pde3+ey>_XdK^`Ru z>T)=?N*Lk#T3|X>K330dFq2o-McH$}MY2c&Bd>*+M}r#Y7NSAfPxNUfS!8J0W11(U zMvoHxHY;RfUd^t4MY(D0=gW_^F3!Qgt@T!HDfZ!7j73+lZGGGnjpKPwixgR6?=4rm zvj`ya&b&Kbrds|du2p0&UbcPK>0kY5bm`x?Qq$-(w2Mv|?+WBbphF%X;PEe|oSJN% zxSYpmy~4|JYio1v;DCn?VXASeO`>X{u+(LVA>EpuYneJ#|4+OnoQ}P1>)PW3alGl@ zcy;MsBA;QD`q^R5ypqPzsL>-tzpVtZXWmswL*Ow)ld-6WN#?v>?^}tbWef4Xf%T3PUK+QBw+%(~`YHpE6B0! zecv7jPt?hO4kXc@3CyM#uevZ2Rzp;ZonoZeyrKA%my0Z}#JtwNEQw-PHg~3|q^p$(I|$44X~M zN=kUL`BB|Se|6EehZ`FSKzL&V5J?$h`I-9RtF5yk?4`p~_q?K_sgLduA9AQt>UeUS z)|qn#-Q9z@e+|zkFXBZSi=2T~HJhqn`jRZZT6n2RUjD`QFRJ{V$bgEsK-77gIK`Uv53Pff~X_+kDF**z}9S#XR4x&>u5-{yK8)<*y9GQ+k)P z9t$$bEluqmKc;G*nyRPxu4TMIaz2c!%8PRNEiW%d24lX`20s#^;;87cM5KW+K?_CE)CT6)@#021}js(TPrfXj{1Dz z5o(AcL1a>ZF3ZoULShje;<_Ok$|=CYeG`SoXo$?16_4t#kdm)1?X+}rk;OIcYn+c8 zDwnXG5u-+~WJ&M7OsVpc<=DQ!nE}^wiYc%a!4B-soEkxumD3KKf#k586Z*ngv(0kg-o}R9#7^ zEk?%3-@R-b?Ow$$RThP$E4jYJ({C5To3s}dpE%Y5&zXG?>u|>B33||j>3qb=DtIc6 zKzorJd|WwZ&XCd_pji!>BW&%+0Vp4RgB1^eT?p^Rp#F>9fB(;Vsd3B1v1NZqxT7~R zag^gJo1c}Bb$mu@$75Y}!!OE;hYW7^o$4aL+{(}hn-Fq;4}=NuLmy#VK@LFC zr+nMSEqqF#Q83#mUWEM?FOra#o(H28-vK;nF93xe2&v*({%5)W zre1&l+WRO;?FIn|0_{HzP)}W2v38o#0bXh4dVDl2pwFYg?4wb6a)tSTV=R?&UK<0J zcuqyNP3<;T^%hp?In^jvXkog61PMRWS}-JM3XGT5^4 zfYe};9{Sh~-0WaZy|2B$usta5?-|nb=j*0hEGbVM16Xn&ykW+Y=}b14pN}0PTuLIP zYlmuE_|9ApAP<$5oUy_+5BQMw>3QzBEmH)Q*Iv63^%Yfqy|6G)S>$VthUFvuy~1@b zE8y9hcC-=SoVrt(&~i8_DC?r!>iyTMp6y{=DdBlc#y&GaOLlZuNe}2a0zxG=VT(zB z>xE%f4;dRFyjyov3JMVxU{n=1ps`UFUGx_ZpCR&)9oE9IjXuU$P)eMm#n_;aZG~i? zDj5KtCpaGPz7zz`NUTE56bp3Dcydm&iYE698M;x0Vc|AIB9(FOHu|>N{(j#pzlvh? zGLw8(VTpAdi?o&-p@qK9M~vUFLa#sA8&|w}MzwlG=M~?ytg5yzKff*%(o-Lt8Z$Cy zvbs^u)|FuEAYW?*9XcaWPK!xp={ThU;CX4sf8Cct!x@RyKACc5fZ+8sAtFq$Z$QlDe9s=-*gQe)Q zr+!-l{Al|~JeFgyRjxObupRlGtiF7A^xv}PI`^mEL7zVntK{hrH#&>sLxY3uxJb_z z7#0YhX{IK^+n0-N<=~N;-ma47bmQ=9I{od6&SCELgOeNSk#=5uzoR7>+?jp1zqv+d z2ZpL<^JkIe3c6|LUbo+92c{MJWqTE75+hw#|agULfmu> zl`ffLZ=Tpgc(WE@sSt0UBL5c-BVavcx9U+b8-2JzHmTU+p^i}10&FKiQVU|w z-7S}m*L{RdP;EKlxuIAx*v>U^|LL}`yii?J9Ufck+nAZ28l9RtbRv^}M8V}ATqEi@ zKzA05*wz8MlVDf9xiPSOnw+KoAs|8L$Zvi3H=Y9_a#tMWTA<$nf<~ZIpZs%co!v09gRM@Dr!d%wQuKbcEV?aRiu zoGm!~^e*N4N=2Y==g3-??u^O1x9&-TJkVr~aYz#21A>?kgXfc>PD}O`eAmnKwcLy| zCfRNLQ9WcF)j2yyLxvC)xDRbICSNb+os~bfb4FHkPk?68|f=@K8Aim22-;8`n{I~k1PKJ!m#CjW>qTNlE z)kXt9xx@6<%Fd|q#7JvvMSVp@wi9in+NL?t4+{DDy3m((rDOVsI1>p#_oynfGgX7Y zaFTw}f-Qn+yqNlN1sd9k{9WdtSmA|)kQ*DooYeR2((IO{J_3M0nc1-%CF+OpwQ@7e z6DwpvAmqjdFhBMEz~@vxwuht%k5BvGp47y}s<3$EyNGitRx~nfpn;dbE$<^e#uR}s z=v1#U6MQB~e0`q%>*Dhe9snwB1OPbZKZIxr&p+xj(K?y=QpPMd=I4(NP&qNBXQK3h zG&#Amb%o#xh$Jp0i4ZFb`l}O0P^sb_#(DIW7fskYcO~}m$5y?V@5NZIH z*T`t{WyGFbgF@E7D{VOf?D3`%m4^B(jpi zTG@$s=^AW{Aa?33seTnaR29rbYf8wBfX)-w`+c8>(TqUXjCjyoF+$!r{7`geVvzxX zye!O0Gz*KvOd4dgXx9}-4e`>XNP9izq_)8*UsI zvhEHFodV>FX4^vr;4{F3L|(~Rq(WSPD4{02gw7#~-f>7Vo?}fp`X60o}yWiR; zIurapeazMUrdGo~ihq&wRj_+|uw_;iqcK}jlddnqXu7VLX5vtv-p+v%912dX>lmi% zj;Om%n$P*R&IV!s`9k#Ozi<761v8m~>dk#tGKGpdUc{9&6`FwPJj8_+L1Owfua$yT znwU#Yk^j+9H0PDm(XO7wkqxB~nIMits0;O4#L)l_sFLZ+8EWB-6*fIu(IEWfDZ;Dz zyw`y42hY02Bl$vKwa~vQ*IaVD^BMUIbRKYn zRkRi1O~`^|(hU7l&zHu}j#<1vovwEufH)Vkle87sWI=eacR%+5fA9x?(ip!;Y^T$28TE}wUteTIXOx|j`y|w1)s;^=b^V%7s2nnsoFA!`ojB!+Lvm8eixE_%8zg!jl$%8lM#3s!v`C zNs&xJd>7uWF5MVXwQ#N}X*zr7d-cZ}cMvLGEpI9LT~&F974Mt!8Ty z1lZA-b_e@tqM6q9fY6+!Oa?KoUaxq;8Q*)-lk^Cs$RKdsY7?{-i3LqYU~Aa8x^YKC zslg#j^E8b@du>qnU8OTKV43(b{5(8*N_0KAJ~a7(F@{<-(^N$V=rZZ(g6rl;zt$0Y zJ;W6@-8b?b2H?HLO#7?5Re>B7|HkH3w__uND3&=KTfD0)Y$>&LLMCPUeJLe&|HGj$s;h+YlWXvcWX{T`|GUbyo zkgnYY=(!+l_u8U(n8cH|Z~cs=2%s8Z=3DeG?C&Q4{+0wW5>X*jf4Ss~xDXrg3U*=- z_Gm|l^#mqZfaD7ZOtx0Acy~AkRWK5pnHNzex*43e*z+iw-|E(d_)@9V3^+ebiYiEo zL{9)lQK4iK3YIo8rqr2Fm1=cFM|$R|sDojIw^@$B!GdhQKm$rza#Dr+sDd6YJczt= zm>EQ5)jWs3IwmdVnzH#Kk#wmYXNeQJeM_qd{W|?SP$!KtDA7s7(T! z!=7l4XXs8ZCGoH5D|y~Z#(b=JZ53#mvbTgfkGAvV_3@MT=MyPM;Zq{q?3tTC# z!Qezvvr_mK8o>TK7-xy6!l~0?FP^{C$S?4#mCJF^BT*2xw`38#UXM|l6>A{`L#I^S zVZ$;WI-krIk|Y3rfe&RTWH1R^{xGSF(;<+j0El_Lpv(()C<{+PbQ$>SV)?BGj_9GFpubYPmD! z4TZ%*`AI;JM|@c5S29K|2n|Ad_a=EXyLQSFj=P6?<|@VIxy&C@sjP`FqweibYwKYy z81=9e)fLBViImFu0trY+D}EK#mC@y5l}DWQm!X6ERGtcw(FQ3-Qz|4`cDXxm)2n`u zHkWIY?4>J-ay=|BEBLvhDHjzfj(?S#GDZMp_^Mh6#B!igx2C`;+d&yooebmYe;ZgF zO{+Sfdyp|o)ND6M>J0ZRY=tAgql7-4jmRj7_@Mtb*XTu+Wr?y#1qx&iVsnqWr@3>T zN-nz&$fd(V@hVovvDdS}o)k=`ZavAJKUhNBdynVQ@{Kn=isCq|zo2Xof|uvp?c`r^ zM)qX5!Iu|~PNmH4N5ga3LS=fDnhN61Fk<5X@&-t`^qU1vsi<)TlctStW9<7H*T8?gJL#F1^G5ByREV<#xcg6y=nRKvedTGIh)lf%PHwv4EgyL@i0_xF)Y8~Wp`{-M$-~3tS+r5o zd)vMopOur}2;Fg!fiqzPpKmnS5v7AKCq_u>nw$q*>x0!N`-_AnHnsZ=aDo=|uw;|u zIL4ao4)n3Z#1aI)tH<%A%vO^NNtU<#RY+N#_9u!61!R`$OUO>cH?-cw zH#&e%6$51UOl1Ix7taPsL!Mpqw3l2b=(L4}yF8lCX3cAs+Rq{q-@sN?mD}>(_t^8V z5r+%pxtMY(S#*jk(6S&$5GrsqNf2`GXd)g;eLD-6-R~9C+U|*`$#6>Vz0psJ@SCv)1z#>!G`^)fDFu`!%@1H7_>CEGMTY7BBc zsn0D0zKU3NG|L_MY5p z=?@Br#3dCsZR5T*3@eq$Yala>Y`AHP+vZ%4O#NP~Cn-kKAc+hKP4G8qiA8N|S&VeOFo8HDI&lw3{5m5vQ5O~sMi2EQP0 zd9iz5v4uOEf(tm zT<8i3GS0;++(D9T&F3fL@mbOI-e+d#hIQc&$+to6iwm8_;Ye4HZWhxg4Ox-*3A(5# zK544XEe_^vjec!5>vKkaDMlLTy0KiFL?~t?%%`T+FswFOP3edRYbZJ*hpZqX{HL9^VGTmk~C9E1z)0*#zdexVFB!vIrw}$?d!MA$f**Y%1 z+9tI-h{mm%5oWPFMvE3uA=4P`q>kR#d(xf)u#ET7Msl2-zDrG}voL*88_3D@%1sY{pvOIJFr?UY!&OQ{jM=m2T&vx#{ z98)68hgAx8BUb{7^}Z*cf`;&xBw?1F$(8xaS6FRWHZ;EJnM78b*ZyIO`sYR(DjGn~ zw!&=x5jh7_XCIPic*n*(Id0`XNh*9;ekJ47ri=pJmxY}YwpKkqx=M*i1y$3Igz!RQ z{gb^G-JrS+YKXnyxfUQa6()ez6tNTea4zCb5COtyW5OV=PGII}0Y~+i!2C6+G3!*| zqQq&I&njf2AKZ&lvD934I@$ZiWHr-V)Cw=ujOcA6NTbimNic5iB6Bp8=Ah;D#P_3H zhK}(w&MDT1^qrD>njy^7Li21991fOx>A1c)gw5$A-K}b>%bqk64}IPS&9!U8d@^WHw|P(UAC+jz~Xo}-h!iW z_7(4eK?%7`fD&j3gxq@%OT1lW6W;uP)u>=+RQ4<_5(ESU*)a)?sH=5K2(;hPqOA73 zgxbBOeVe-QWVm7qH47pcYF@>>Eo<3g+^gsn_z>8Wns}0jf%uE^e8dw7{bK8C-*4&F z4WbJt{!0#Iqwf!5Ly|_4+Z$kLL9A0O&XCNtb3XxAU zB5kXBL%!(9$@6tKQa>AmFc%7?y@O5~;za)UdWmvwtZw{NnRe@=Tb(LLX@6%Sv@M+o z!8q=-OJmnmt(1N!psJtFbzKD~3G5eVG4*3$a03Zk)g5yD@k5}b)~_IB-e+V~h$M~t zKb{B~N!nty+I&p}FhhFGZc*z(3%$&Qc)mGALDn`d-pJ=Chu_Qe{3z^5NCnO>`xJ9B z(pghdR@>ToMhDIUpUg~JQFC-@5jR!zF|w1xBV$FXB@y&YFT;yKO(&L^p2cci4FdfH zf$ko@4|^7iT|hEpE(6I=EdK=CKas@H^n9N2ABfq>W{OPqNR~-_nhT8vy*b(fC~LC$ zUdb>y2(2`=qZ*@0uQV>q?6YPT$&sLz!6F!Ay}$RWaQOkA;9TCE^W4}f(zv5P7z&vO zYRyI|X;O3KPadf~%r^!*{X7+F*3)3QTwSn!=in_$F5{KU?xj((#D;`rz4UXjs~h5+ ziWi%OT8TZLJvP}tRIQa(V|4$2LuZ?)mp-S@sCTxuR1d)RV8ydvkJcj-S280r>ssYI z#pR8i9pQ;PZ#3enxnZ=Z7M+{5kBqf4b@re8<%_oRwmNkDQ#|C5iv^kgArTxH(#W4@ zQ%@FU=tEUB(EMxq6N!D;&A;X(Cg~&9H;A2a=g5J6m>Dm_R#UiaT`+&e`T-0ERyQv5zjSpkWaRDwjt>#Ru$6 z&$WnXB85b#E4zJqT&K3I0s87IkN*)@5d~?25BP6;cTc%|T61w?^6c|ZlXHp%2E%5MDnVk z-$Ye)g&~9+A)c;UUv#xJF7kn*9(Uo8{K3i7)LaR_V`6LbP__-^&cyRj>QZL-ciyC= ziKw{ORuj8==yvKSy_}Li;RYAO*CHK}veRw66Mgp1J^%DyRO}o1E=`|TF4qFf8cbnO zQyj9A6!H_2`Ox!k7KXmU5bgU03UO5G+Fmt!q@cTq&P%-TIwVQBUk_|a6az<%*uXvq zkufR{xWbk2^@mvI0VVFEH(SPSyUDH8Sj0W9NEq#4ZJX&9`ix?1__}u?k$9)MprE%? zH`4xID{x3X_h_JYbI&+4iLB&ylYK*C2SF4PiN-lW*f^QrzeHKy-m{a##C6D>;pg0* zVJNHK8ql0m>Z>Ff@TM@h%<~2=i?I%Fw=f1`UVx_te|yM41Xts%^?NZ-xj;o-)ge7MEv0 zv~ZqeNnRAq@k`fPUc-R~r8nGs71&Lp9QTLg=|KD=x30dL&0u&*F(U#bLHTwW;pmN9 zJSqLz^Jn8Vp1U-3s7t1$Nf?ay#Mx3u>Jt!+@hVkp8Ck?T;d;;9CnctubXyR2!Qaj> zM!gH+J$-ZWMz zjL*b96@2!O!=pD2BjMb?(Hy|!W->sQaN&p9M>U562=HdmQ*u=o1A|W|V zCD(NOOm6gCWNHUQLIyjyIhGU_E??N$H16p;C+-3sz#336)7}%v`U0gk*(?0aGt{jx zCVNY&ba_AR(6460_Uctvae1MQ|L~EI0P|L=c`FO?F%@J|7XJPc@^E|@a<&CVnm=t@K!!^FL zrixH!-%!s`OG`sT1~2RIX-%TL%RP=xsx1Vu9Q5ZEe6+v^5V&`21rXFZ^w+(sM_!wF z>9iG$p18x7uHs)$MGRZ1*dIh>|7_Z618?kG2l>t@7m^uME1EneugVnm4RL4<8R)o! zznj375)spYD^Y4bJetaoSn7YB7P4Z<5e;^G{dn&c`;U-`xO|5Ff%X5b)-v|i8U9m$ z%)&pp39MI<9b{iuB ze{d9|c9B^swA=P1^bi0NR~?3@(bYP;lhY7rcaW69oDKzhQuJ};A;oyAZbp{M>g8%< zL%c>?*MbR(6X^qA;Ue&O2y^R9Tbrxr!cT*CR4OS$%dT3&D{OCZJ~*A*k~8*rR&D9d z{bm>$jTDD_V0c=VVP;TIp&EMK&CZfZYBPM^VLaW3xev_Qz2-sI-JDdb4OC;iu2t?^ zQgPRER&iQ55ieBMmPx%XbZkEeDkx6c3dzIBu^S?4LQ(*tQ!%F0EO?O*g^=*Ku~DA^ zChVA*U<6VfRBA>I5xfxjs}MXAJqUzI7hVN5Ty8X^OENx&It+y4m6~j>XJoA>9nG3E zyF44LUNp2y;cuD`i{p`Qgi6z9k#_uTdNtO(ao zAR*F*OfPL5U%9-k)LI1S!$z6EKCgcMC47;+iPnd zRRXQyHdz1iidATML>S1JD(+jqX{c%J9ntM=tcioVR)b#LmpZOHZPrcYc{bN5cpeyS zx5HXBRIE}N0!%Z>mJh$p)7A)i3!?IPhExQ29uekGijh=B>XaBW8S&-@>IC+!0zj@* z{6V>=CYVaEZZ_g?F=_tW_?C7th~%;M19+kWqxray!6 zBhRQ!x_~gUzn0yG+goepa&6vEtF+~|s`Vpk35CwW913K2__zo{hN^`gW`^JJh9$u+ zELccPQ#}$lWFg^EJrYeakR}e$g9enK$>DU8->bfFVl)z^*GF1fT4h&@c61{T+4c66 zAw7Du@N(=~4SkS(D_F$_V=Pcnq}2Cg50MVsX=EYp-xj7nBBiHsP+L zR?eQ>4I8_3Qo_yr|wiYC2i^T(bb)wm0@H4Up=_hSGC*W zlh))bop$`!-!$-Kv+gFdSADCebe7f^pty+vRXxzWY|qJVVEF1+NjLokM{~mm#^Vh1 zIwY&tTTQ}+hTC98a2A*YA{8nkNAT5TjZ<3-ak?ZRf}0uWrD$S8Gt8*nFudOlLwlG( zTLQODZxaS*7+9H^rB5xHMyUiayPKde3ehY%S~NkOV?Gn7{YWcvtxkko@-v@IWTn%s zItt|->*IU|ej7<^opD2VLls@x@aJ^t%nZi4y1+s5OQXn9?c047BQ z`x-4 z=+u2`;d-?iz?6rHlc0mC1qrW)0LWWcOk!2Tv}W#8RgPCxgl7D6L64gQtxdTwXltNm zK?ID}FE*zPo8lu2U_Mp|Rx!gMc!yogvn@e5A*H{g2!#^mkWK>8w`mTmN!2{-NBLwB z$#cG>ptKGcbhUZbm#F#J(PeBdz6&jB$?eaoD5)m;PLjF;gz#bD_#T^=Ab2sgY*W>2 zFX~98NaI#}!2uH08$@vYN~K1vG0|nq4_WSF00DN#u1>ld*jSp0SJVh%zC_aaJVP?z=w=r;NIsy4_662VH=H0ZTa4d* zrbravBn71wPrA7o0a9AMrEcy?|ND#8PhI!a*iAk3>*h1YP-3IW>*sBURO~ssy?syk ztRh()&Q6?Dgi_XGg#4m}B?F$a&i?ESpqNYojlqN^2B=?KvyrOGMr!kpHc5y{ChfGnJDFPBX*o z1OyR<+uwsI>0%wK2Z=6T6TO0fMD}wF4wZNoo<&j z(6qZ%%`$Zbz~y|}duVeQF&kEcr)a?W%TKk=Ki3c_lkm%j5PptSRd@P2YEaD|av7s4 z{Aacyy5@(COrR)+n7v~dIIgcico0xcZkcJhv?Mlt!Y#&2`b}73(=s)!SSJGwaxr5Q zF7>D5Uy!w!c`XChhe01?mp2D?R@gYA@>87K?N%`4x{kZNR!E6rj^#v=GLeCLR(a{w zd$fVT#3+%#=P>$#LBm`ZEqybT@gAogupEfaY~2uW-wr#7gi^aYZok#D4mWx&x?va} zgxuce_39Au(p2)b53OTl+>1QDE-KOfy*s2ZTcc#oV_{#jIYbMT^v1J!;xOux<8KDA zu%a-UrBKb@$P*<%Fx-$_?8#g_}AN0|MfNw!^)18ymIp$6&V;hhC&-m z>{>MuR2t|E^8cqNZA_^^Npm<7fnt-B_QYV-)0KC}%(Jj@e=_JhhU)X}iKC%)qvs`Y zcw(&(+sa?2p8|BAU;qlKf$hPLqU8!A%wRjGV||?WC2vvB%1RCt?TE-E)>zU7p~%aD zk!A(_97VWDb%!XX`{O)m2ma=}11`0z?Lp|n`2pdg@WtUUi^n;Xt%Nn9j86w6Jy!d4bQs3+SV+w(h z%mdXNEeo$ni>HOufnAqr^G5h!!a5<9EUl=LEuig7DMg0H5C|a-58;`E*3kXF z>k%l?Deb&--_Pzn)60Y$%r8gTg-NqU#nAHz5L0pIeX@=N1$UvM4HD5BIjihrRA&nywkf;N8N;xA)yZp@?yAY;8uOS&c2H}^hk#0EaV62HnncMHxNmf=ooFH5y)5djORa4$t%Q9p(o?Zk&CeRVP z2`OKD7k;wI3wnKK9 zxryt!w>LJj!FUR{Oz*nKNgCMhGdZYI0|WTtF#dy3z}H? zQ8yEH*Uuj(oa=WQ`FFrVesMVaK`7wruE^Zn z285ux1$;IW8?Uqe{!*t%13M}vu~cec0AC!E_~F`~qKD2AZkpaywb5cGC-B%2^5vt} z8Fv!&MJRL+o@PL3N~WQl9c2fAVEQ_vS6^T~D<9GN zwHCj8p!Q_Ds>Pr)fQilww7&~*v6PPN(|Z$8Y}e$Gc*KM6biBNfeWDQW?V%3NX0v2D z@XOQy7>^Y6<+CdqKwJTuz?(jW=ctjOgc;S9J;fL4Q`{m_dra!Zq%%<}=*u-d+*liM z)ASl)>#;(C$pGIOrYE)l^j8IQ%Yt*LDD`7Lb4VBm1&sD>)S8qh-qo5nnVxUc<_Qio zZyN-Nnkl}x zaaqr2XgI+Gkuoda?A|_3;Srr9$Y$heICP2v-2M>uoG0;$o~rf_9riW0Iao#~FJ!Bg zh2Mm9lN}f4{(kSoz_MRq{$cSETLB-%ZrIqE%hzkdtw=^sw7pHaAeLc~4rExu! zZiixVaE9BVyy2gS1Xw;`)DclwU#EA5^%RLrl%Pj88oy`gzc^SYzbYjm*99+uDB%pjaFjprWx z)pkL|KZMTf`}9#eF@o$I>g~})|Fn2xAm!2Rl*vFMNnWBa)8(Q}USo?g2dgXC*n!kS zP-*RLzo#<~XwJ%cV`l1cOZL-1i+W%vCAZzj<=+q}yfvWg4MSo&*Ud;8x-Ju1l3s51LtB)qj-oJ2!eu^P| z$@Ubt)zUrx!tw7f)`kg#MW?bG3_TL9;G#(ZP<(N}4>lpRFrVbVIGGvC?K}YM{{3Qg zRdr~1?(9-}a(rkhKs~<(ecadHR#RC~)m&3UlkZpg{+t_jcvTE9NO_JEn|LQLy9#uz zNQvjr0)pvR0P^Y1C1t^`6&$Uo~o~Ze$lGfYPU8cLPS_j7i(dM_yUYxSStp?-tQ~zS^M-eUn zV;PIk=gM9{_!Ov+DLZ-xKA*!_oKS+=L1>Fng6VD7ToRmsu>9D7Kpr6#^yZ z#U^uPWdD@*up0`(51y<*07S4aX38Ik27uaMZljhvvq98k5PW6{fy_Cl!#W6nY$QzC zi6!-|dcuaSF~YF)4>|}i_nm+8z%tDB-dqVDg~p#dSrPawg7ht|X48?b3 zr3si26$zy>l}+x*$o?rEI5tE;a3Jj5IRgk0`Qx~;6|wT(rOaO0B%MQ&e_g`^d)VPB zD|2*XbgG@7NZC1bDLul^Sva^n3G!9}=Ozts#mYsHory03XDhZM9_eE6EIr9=cVXTN``Zj3UI|rQ`q1`dIHq@|||XM3<`@wfaXwe78g zGt(n|eP6#SZQY#xKt{&Y}z)*^bN& zT2nFYrjnqK#_U)u5s%#pVR*@*cbA=&lG6wjFWcParG`*KI3qX1OAdjfgkM$JJs4+_ zZc8B}VuTP(BDU?>D$oDn$D&{9K_J+Vl-~H@ zyFWr_zqI`9p@qCh{}_N@d1f^@i^%c2FCL*6{)})Z25T<_+3ayyj&b$DJmki1J7ep7 zTzBB3CxVT`_qf8H<;K-6nWug9dXMiYACdt9gQZt80&QCWyEC3LqRsFPQ8skLdx)&y z4T3^0P&Ua1?$;wbNhQir5Az@s@r~_Smnh=;ihzVHl%ZGymG)Kz6Z;NNK>Ytk+l!(A z2Qv!!&7+5Ixo(K;+2!|XpV-y6yALBDIR9Dl=+Dd??%B`G&h`v;&CZ{HPRP>c@;nI? zyAc;xs?JtqV%yryjg_+)6gzKrY>&BA6sxZY^nrmgsG3lS=kt#7w^K0LEQU4U9-%GL zX!WNv_CYfQ7@bI{taUjszk0LuM<%_T76^fQc1dq5gamc%l8!GJ0#W9c5sBg7^@yI% zq!SSvOpUvwH^qUF)?LyZnh}UH2M`j&zbAoo4UVpxBFD@&nVmW%yi86viRg;3T;_J? z;);~=5?YTnwy6rcX(4YRGopy>W&c~=gUWK^dN|>tgP0#%lqg1pIXRm|;gaFT*#A2a z?3IqSfsta;tK98;yY#xMqV8*yEtq2eDGS8PGyPkB{=HHSj(~BzI-5Qg{q>&J@C%am zN>XUWDCeoIXHRMifb0xog@05bLF+(Ny9@|{E*^~@WS9&quF$l^J+Tt*-MV;l5RMyU zLg~2X==}B5J#~Wdb(pKFgsfJqj#^hfa-PEI3O)k_%d>}DjqR-}A)*-&8p_Alg`;IP!BOPgiskVAra~%#ux392~`w>|4cH=>WZ{o z<_i|`iaK6VEgzgOTz3Ci+4>-Qj`$KGpP=z4Inx)1L+C3`ea_&wV})SYzk+ zBxxyn+xzmJPgK3^=!>>INZGHwHBd5u-ZBPY8+~moE!7V#K6>leXKLr@xd?lBRI^rT zG|R;kfx4HFJcCBk}^FMtw;KCkimWifVI+x6CpcQM>S4oY<~UScwP z)lv}Z)cvvy;Ij85Fswv(54T=zt@-<%^ib=kYiNoKYJQ^7iJ^!yud-jhoaODJv$T}V@76yg2lko^BMo!?4^)J(V$eyY9RyBO4MUHby0MJ3 z0I(ddEeKhsgXH?xf?n;0l%A<^95>O8@Uy9PoL)$LU6`83>D}9XZfYOrToCHc@hmQ} z*;Gr8-mSVY&wD|7ZfYl|7rM_)4do=eU9zLva?pE5QBb*icToDNs#>2pSjR!Ft(^e0 zY!kq<1OW5108o=DN$KR!fhgBIH*OR~05-D%pV&uFvP}STzI`wu6ph7jc^89ow#9yf z5N=OMBM^fK9jR46e)Bf(f4U0PQNt6P9b?;E_KDFC=CAX_TF3JLbJ3VyG}n4cD*EX#?OHr7R=OJQNDSr;#d$muEvQ{f{8}K;Z)D+tcgu@f!b4Sh)zhIMWkFLa2Zk784@~X zD5@1FD}`x~n6sH~HkZ}3vT(0q!#UH7UCaGsS15fIjOXl;x#=)kYpB4%BLrb+2M00- z|GXd=wb=+51@qw^`Wd6Qg%gt6pot^WKZ?;$aNSK-W`RLdeZ}W;EyrtHb9w3()9_qOKCclJ+v1gR?TWQ`m9v*cx5`e^ zxMv&7v;^o@(bp%}i{3upGYypOIn`z5s;vd-X=|-0DEG5B=3N=DwXoFd?dxkPFRU!l zVXavh&F9sGsme}u@iL~GUH<@Y`+k-&RAC%32j56E_-GM)k{BxeX(UJlDHuBAVtTca zla75OsZ{ts^j|NSeCQ_F*pU$gHr?uEw*t_0jH`C6hMD*))Ii5itv#bNGo$^$zjjY6 z{Cj7m@$7Cdet*Mv&8KU>?k#^uxfx?FsebgGaaHN(dpG!Dm+;=j8>vM*X%?d`Y3c`P<^141VW4`6PPDi5?^9XCJgbBmN z{iJZiPa?p`2!wqPbrKD#5D+nU9XWB7Slmzs8_+1R&(2|HS)eP@Rkf ztQA5Yx-$4WM(ICZ(ynDi$1x~~RvsFi=$YlgHFtARkGUT#m^PtF&=A1O%|D%rj@(Q1 z(C~w-5B#xROl)N=T)h2-4hoXNA^@QofH0+BGxDTv(cM zV8@~h^GKFb6AIgPI-NE9c9UFaFMv3S@ZGQqWkcuL+4cA@FYg~pa~SiE@^WPO%IVM^ z47B61i8YC*U;gMBHP8&TtOe{ZM1)j(ABVE;D=IE6eeM_DEzL2?wm(j=kq7PzeiGJd z6VsVxN+TyXjctcf`X-Ok_=tQ3dEIn64DIpsY^FF8;W&6M=^T-M$=!(&kqfY+k^4n{ z=`Q)_dfcH%q6O>JxtQ4JZ!B;JcRlDjw3S2#`4O_e-L6;>$`RTeKeVVaMfd_g^u8)NNtx-0sC`!Mcfi7TBofIj z+Nq5+Qv3dyTa6ti4*};ZV}@o-H|YE+hzbR?2$Anga9B;@@;1?Ks@==e;3Pr$ewFiBjy$#CdZ{ z1u)s<6i1)$p;xA5`G69;O#=~odbLjEr_!BFSZMor*Nsgylh;o#5J`w@Pa8i%i?^iS<`bRy zpKz+Ii48dKFWPwt+wN?RlNwgcqOCu=)|34c?W>Uck#25kY%r@uH`|@J>Kgzx-{ z6S?|yjmuK7vmO6FUAF&0Xov(iHiOd7gypcBkwQjXkzjxlltpK6laHROWFXXnOiyBd zE_{eMcyj8n`j8Cy!T*ufMDFo{Ns!;PJ7p&BW0qS!CkB zb-M(0;(U0#R!!Hrp(l(}M{Lp!^s4bS@R-?#{J`P|Rh$dL8lkAD2+S5q;mRn8b9$|~ zDkVFUL5T~q)#{@$LNDC9OSVgbBb(wHC<{CVxGGG}V^{V)5KUGl~N>CNy2&c_iBG9p) zC{@^(Q|F4l%HE1B7aC)vsGzkn6&-k~8?obBP&f^wM>AY6U7@8!YR11ZwW`GdE3!pw1>(#-z2Sg;d9|l@!76yNTl$ zRsBTZ8GsFzVB@aA(vMtPJ4i{}W=82FrZ2L8CTr{^6ZQlOf(q+(_E<7u4|}2-QeKmT z2v26l_OpOqh@`5)$!Nl(8J7~XH&}Xb3?De4L;Cvo#6r1-SgP94rz$g64}KnpbbUA&-TmtI!TTOKdG<-|%&%8@V(=FE=O!jC=G(BK=!Psp zwRmrO3{THmY~55Pj3M&)EhZE)R+*+0OGxkA;qGYE$fQykT~p53r2UZ8;^b-#?gJ1v zAI(f7gDB*GTB(@~P3HS$GRz$7on=Q`56Rv`qp#$z1;*FEl7etD{CWRqBYJhu%3Feo z*& z|Iwvj7QXUif}pjQz(x$FazpN`FAW8>DBUA$-&hO(GK%qa=}7ev?Kd6E7e~>Fk`++u z^8E3>A1Qu&>IOoizRUa+rtl{@z3XcS?J-~wBq@DA&-UAdhX|5dh;gjQbIOo2~000Acx;oUibP+NlWM)L{wh&7O(L2U~1gC9%zAqqm40nZ&}SG%M8V0 z0&ibd?VG#Twk-Dm{7ZFumPv}`*i?BP?oLYoodPyai9|AglSGG2*6SBzFQws`9a;eK zDlb&1$m@Y^2N*?+uwfoo3o4XhO%&G$nk2*MJeT?MIuu2Ki%S( zJ7yWvU`dz!2ObwP^@CQ360%}q)1yOhzp9ml!N_O$A${GjPUq?8T{DLvhM=R&>g8gz^d2649v*G% z4G{Fkn8i}DK@ zlsBQiDi_7xQ?9m*7eJ%>oJh5)p-Sm-c5(d&_CK=|m!_5|JXYX@+X#O%~Y~ z?>GmMVO)w_z0Cf^5W6>AD&f=Wt6&1Q-|DfteKtLcJ~R57wcd0lk!%rw2B4S{C^Im1 z$YQs(f)vw-1{pho%|R4(gJ2)fktXmczc*|HpcA!Q%%H zHm=u{CBaoyNgR&l73&#TFomNh=Y}UvG@e|*%JP>4r9z?6-XA=K3PD}h>_7ivx!zYR z4X)BsNApFh*$x>x1qrlkx|Uh%_{90CyJ^mK-NJTf#FonU7eJCG+M5Uu z5g%W})-vEhon3V_bg*Fq(PZ%t|*%) zym+JY@Li4oalHMhApiK_pxS%+IDqXlbN)GuV#fg+{t+Bl^Mx$3)j0U6PAUfRw2k+g zy`9F^n$=xb_VL~bScm(2%;e1Jdh$PIE%?;`22gFh2OUTVH_;@aX{G_%W6z)D=-R#s z=gG>`qcLftvXZ!S$;)T>%frgXEF@w4kv&o1{G7Dz#D-ds106~E(7m9T^fbl7RF!Tp z`VuEUAieFOXy)-&wURs=zPUz$;0onpv0SHl2Ego`9!9h|^yX$~%i!CcEy1Q>XJ=?I z(%Uz3&qtyXQPAM4%Z8ktTr{ss zJTh+w2D8HyM^kx@c%EZB4u;raA$<7O*|~XTJMl1}dLLj5Sw9H`p<%$8;Sgibb6yv7 zUz@RFY_nkYMex8gS0c%;*sf<=Oi=R%D$Nb&)4yh}DR!LyK>+;hCF0a2ui^~Qv619B zv;?95z9t670}3p{Lk}K2csv!~$vwAXwUv@BIl{CR$PeF@DEmn%Xq@EwXL~1MiE=XH z8XZ~1c}mzi0=5N{u+CcN7TT|*2qx&Ua%hF+>2eRTx8n0~vzZP20z_SCn)M9l;q-&q zJD&$p7rwg`;G9D%91l?!D2;H=QOntEbbDAjVZ(HzlpJLz!NM@uv+HCBw0*yFDHpF- zOW*Au9vdEpUKwF@NSBW=J2d-6Q?$DOY=XrR`d!HDPT#<9dkputS#MZl*2XN@?<5g< z2W=g*pxQpnqAS>MW(+lAXUKrD9(tb@j(}vISY|dR4AK_&t@AB}71(tq4AXkyBcB%J z)U$}2mIGogMBHnecAdPUT(X4q!6X*^MpjIze?(R;t5L9y!Y;6LDdczji1c-GtMbbeV za@n$Y{K)tU=ci7bORdKBRIxqPhZD1d+^Td$}nc-ZY7W^?^q2eB3d!!?SI13>FONtz5_oZAfJ`<;br9m1xwM zu*PB(z}Ud98R5;TT-0R0&;1`5@=lG=znvtI|P=sGdnUw zvZHB}?d;EUyjMEEv&8VxXGbr05ipNnM)wNi~QDHxLTO0*Oo2Z zpI?~jZhG~))~d>4YJsl>{tfwCVX3|?QK(6E8F?7fn>XhSNtU=vse@DTC= z?Tct1mVyvqmU|(+$e#rRdMj~gW15XgbgvYwk9+Cogf#y<78v z^QQ*}4``NPtOJ^tM$wCpKS(3Qe8mVh@iWI*$;$0T<8c_;a&Z^?OR#~8F#QPsApK#XJ!Q};M~?N16#>8 z1tq+i;0|fzhOeHqj1ULmf@UsA@T?u%jI>_r@G^fU23k_VAQnAOhvsGc8-&LFl`ZX- zddbIYY*;MVN<%H<_zeFNJS;E4Lmuv3!ipw^)|n2@_MZn?ds;oxAKnrDG{!Wo1*R(f z)nk*{t0ga3 z;r5vexTU-|vaf&CVhO*u}T}8sPieeZxw=CaiAq-5>hiL{r5X=k2K_dMYEzhcCBLC@?||n(*r~Lte)NMxgHU3uB<+hX;h#UfOiqj$q?q& zF6KEt?CeBY9U@;25=Pj#PNQ2dy%ieW@rl`>PP~l5aMH10`U7lPHCdo2Mt(c-TX%`Zc=n?4u{oZ&gX=) zisL@t*0^ak28fP4V!3N=mh3CBy7L3#&NK}$PWiZc-}ZM*fBsL*9kZk5F>>R?GgSc8 z_jW;*|6454P|GvHD$t84B2*Ep1%yRHr#9>(aZdYTMhc8l#HMQ4_K#X)X8cU6vB_!; zL0E>R=w#pWHOv&W7ybWF%rXaBHIr$2I=H)1bJGZ`)af@j{_b=#_z#zvP?PEWN?A=ed7GU}p@=$^qXAB3(*S zb%wmrBuwTVIzIkjZvGBZl@V+jQmY^I2&P@dt8%TTX|04Lp@6xK$UxJjG~+`29T^@~ zbF6NrrOgxyHqm;2bE98oJP_&a0jboTC}T-Js^o4YPvZK19&zcC1w7xGPXA|!%j6P{@dc?(=r@xO{z+%a5tdZ0yvs8Ax7GAdE9Og9d)@VH#wQ% zyp?g9NvmxANnB(t21JTXvQ7lKrD4xr`Hq}OdB(V#5hxCgNKJB*i{oq*uFxnB#`W9O zQ{SKEmU=Twni4#B%?^b$p94c>L{(yLQ6M)v`vTY1m=~55z|mj?H#VTGtP)SVCITf8 z>iE3v`re%IV=t&L_o<|qBTi>~E@!PVK6b7Aasup8DGg*)4KrKW3Jf{b1Nr#bmSM-k zL66OFs9RwtV;feGOdJ>SKi-&8zC~U;q$s7k_U+LgV*~Vq;p%1lWm`{m7N~_^U*G6g z-R-2im0fQ=h91SiDS1ZT8Z&DxIAt9kd$$d}$E}E3nNy|_Uo;vh)Qna{xo@S_s=mH& z)=n!(-cF=SrBpLdV8~g`7cE!wqN8l-9OLqLD`Hq^2rg${$X1py=zi;&1gE9lg}Yc5 z5NHSt9GpiL-LTW3iD?`SAV3$7&s*;NSJc@>dO)|MXqvg-4$nbay~AOWbn%U!Kl(5Z z7^7D|jKYr{`xi`__CZgnEW@0c>X1!bU-J3&cATPgNGOMrOsV6qKbK*WglnhLQC!7n z$Dh&w!+BmwrKeyFqSb4ek*;$2t4f4n^6{;KHFh&H^v*YV#T%CxoX+z7yWJU6sN^eM zcDt)miNt&9i7noEMAspD(F-y094GCiN*80WJFkn87{!}OFc_(5^?DZn|52*mkWoz| zpvJ#GF@mbBT2|Pud44*B*G3W*7ISH|Afgw!jp4%**yo^zSLbh;OHtYIFDyKn`DJ5c zEkGW9u∈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 UMQ*lvlk>j@mv~dN-b!vFvP literal 0 HcmV?d00001 diff --git a/doc/_static/xdg-portal-dark.png b/doc/_static/xdg-portal-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..de29a12c58cb2e1072171bf889210591fd2c572d GIT binary patch literal 3927 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 literal 0 HcmV?d00001 diff --git a/doc/_static/xdg-portal-light.png b/doc/_static/xdg-portal-light.png new file mode 100644 index 0000000000000000000000000000000000000000..d97486d061d539147a5876390c08dccafc22c6ac GIT binary patch literal 4817 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 AD*ylh literal 0 HcmV?d00001 diff --git a/doc/_static/xdg.css b/doc/_static/xdg.css new file mode 100644 index 000000000..785b1085e --- /dev/null +++ b/doc/_static/xdg.css @@ -0,0 +1,442 @@ +/* XDG CSS theme for Sphinx + Furo + +https://www.sphinx-doc.org +https://pypi.org/project/furo/ +*/ + +/* FONTS */ + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; + font-display: swap; + font-style: normal; + font-named-instance: "Regular"; + src: url("inter.woff2") format("woff2"); +} + +:root { + --rounded-corner: 12px; + --blue1: rgb(153,193,241); + --blue2: rgb(98,160,234); + --blue3: rgb(53,132,228); + --blue4: rgb(28,113,216); + --blue5: rgb(26,95,180); + --green1: rgb(143,240,164); + --green2: rgb(87,227,137); + --green3: rgb(51,209,122); + --green4: rgb(46,194,126); + --green5: rgb(38,162,105); + --yellow1: rgb(249,240,107); + --yellow2: rgb(248,228,92); + --yellow3: rgb(246,211,45); + --yellow4: rgb(245,194,17); + --yellow5: rgb(229,165,10); + --orange1: rgb(255,190,111); + --orange2: rgb(255,163,72); + --orange3: rgb(255,120,0); + --orange4: rgb(230,97,0); + --orange5: rgb(198,70,0); + --red1: rgb(246,97,81); + --red2: rgb(237,51,59); + --red3: rgb(224,27,36); + --red4: rgb(192,28,40); + --red5: rgb(165,29,45); + --purple1: rgb(220,138,221); + --purple2: rgb(192,97,203); + --purple3: rgb(145,65,172); + --purple4: rgb(129,61,156); + --purple5: rgb(97,53,131); + --brown1: rgb(205,171,143); + --brown2: rgb(181,131,90); + --brown3: rgb(152,106,68); + --brown4: rgb(134,94,60); + --brown5: rgb(99,69,44); + --light1: rgb(255,255,255); + --light2: rgb(246,245,244); + --light3: rgb(222,221,218); + --light4: rgb(192,191,188); + --light5: rgb(154,153,150); + --dark1: rgb(119,118,123); + --dark2: rgb(94,92,100); + --dark3: rgb(61,56,70); + --dark4: rgb(36,31,49); + --dark5: rgb(0,0,0); + --text: #f6f5f4; + --tocbg: var(--light2); + --tocfg: var(--dark3); + --borders: var(--light3); + --link: var(--blue5); + --link-underline: var(--blue1); +} + +::selection { + background-color: rgba(153,193,241,0.5); +} + +@media (prefers-color-scheme: dark) { + :root { + --tocbg: var(--dark5); + --tocfg: var(--light5); + --borders: var(--dark3); + --link: var(--blue1); + --link-underline: var(--blue5); + } + ::selection { + background-color: rgba(26,95,180,0.4); + } +} + +* { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +html, body { + margin: 0; + padding: 0; + font-size: 16px; + font-family: "Inter var", sans-serif; + font-weight: 400; + line-height: 1.6; +} + @media (min-width: 700px) { + html, body { + font-size: 18px; + } + } + +a { + color: var(--link); + text-decoration-color: var(--link-underline); +} + +p strong { + font-weight: 600; + opacity: 0.9; +} + +h1 { + font-weight: 300; + font-size: 24pt; +} +h2 { + font-weight: 800; + font-size: 17pt; +} +h3 { + font-weight: 800; + font-size: 15pt; +} +h4 { + font-weight: 700; + font-size: 14pt; +} +h5 { + font-weight: 700; + font-size: 12pt; +} + h2,h3,h4,h5 { opacity: 0.7; } + +ul.simple { + margin: 1rem 1rem 3rem; +} + + ul.simple li { + list-style-image: url(bullet.svg); + margin-inline-end: 1ch; + margin-bottom: 1rem; + } + ul.simple li:hover::marker { } + +.related-pages { + font-size: 10pt; + font-weight: 800; + display: flex; + flex-direction: row-reverse; + align-items: stretch; + justify-content: space-between; +} + + .related-pages a .title { + color: var(--dark1); + } + .related-pages a svg { + width: 32px; height: 32px; + } + + .prev-page { + border-radius: 8px; + padding: 8px 24px 8px 8px; + + } + .next-page { + border-radius: 8px; + padding: 8px 8px 8px 24px; + } + .related-pages a.prev-page, + .related-pages a.next-page { + float: none; + max-width: inherit; /* cancel furo's 50% */ + } + .related-pages a.prev-page:hover, .related-pages a.next-page:hover { + background-color: var(--tocbg); + } + + @media (min-width: 700px) { + .related-pages { + font-size: 14pt; + } + .prev-page { + padding: 16px 48px 16px 16px; + border-radius: 24px; + + } + .next-page { + padding: 16px 16px 16px 48px; + border-radius: 24px; + } + } + .related-pages a.prev-page:only-child, + .related-pages a.next-page:only-child, + .page-info { + /* align-self: flex-end; i wish */ + width: 100%; /* big buttons instead */ + } + +.toctree-wrapper ul { + margin: 0; padding: 0; +} + + .toctree-wrapper li { + list-style: none; + margin: 0 0 1rem 0; + } + .toctree-wrapper li.toctree-l1 { + font-size: 14pt; + font-weight: 600; + + } + .toctree-wrapper li.toctree-l1 > a { color: var(--tocfg); } + + .toctree-wrapper li.toctree-l2 { + list-style-image: url(toc_bullet.svg); + margin: 0; + font-size: 12pt; + font-weight: 400; + padding: 0.2rem; + } + .toctree-wrapper > ul ul { + margin-top: 1rem; + display: grid; + grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr)); + gap: .2rem; + } + .toctree-wrapper > ul ul a { + background-color: transparent; + } +/* tiled TOC with images */ + +ul.tiled-toc { + display: grid; + gap: 1rem; + grid-auto-flow: row; + margin: 1rem 0; padding: 0; + text-align: center; + margin-top: 2rem; +} + ul.tiled-toc li { + display: block; + list-style: none; + } + ul.tiled-toc li img { + display: block; + width: 100%; + } + ul.tiled-toc li img::after { + content: "Foo"; + } + + ul.tiled-toc a { + color: black; + text-decoration: none; + font-weight: 600; + } + + @media (min-width: 700px) { + ul.tiled-toc { + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + } + } + + @media (prefers-color-scheme: dark) { + ul.tiled-toc a { color: white; } + } + + +table.docutils { + font-size: 90%; + box-shadow: none; + border-collapse: collapse; + border-spacing: 0; + border-radius: 0; + text-align: left; + border-width: 0; + box-sizing: border-box; +} + /* reset crazy */ + table.docutils th, table.docutils tr, table.docutils td { + background-color: transparent; + text-align: left; + } + + table.docutils td, table.docutils th { + border-width: 0; + padding: .25rem; + } + table.docutils tr { + border-width: 0; + border-bottom: 1px solid var(--borders); + } + + table.docutils thead tr { + font-weight: 800; + border-width: 0; + box-sizing: inherit; + border-bottom: 2px solid var(--borders); + } + + .hig-palette-table.align-default { + display: table; + width: 100%; + } + + img.hig-palette-swatch { + display: block; + width: 42px; + aspect-ratio: 1 / 1; + border-radius: 50%; + } + + .hig-palette-table colgroup { display: none; } + .hig-palette-table .stub, + .hig-palette-table .head.stub { + width: 50px; + } + +video { + width: 100%; + height: auto; +} + +footer { + margin-bottom: 3rem; +} + +.sidebar-drawer { + +} + +.sidebar-brand-text { + font-family: Cantarell, -apple-system, BlinkMacSystemFont, "Helvetica", sans-serif; + font-size: 14pt; + font-weight: 800; +} + +.headerlink { visibility: hidden !important; } + +.sidebar-search-container, +.sidebar-search { + border-radius: 99999px; + border: none; +} +.sidebar-search-container { + margin: 0 var(--sidebar-item-spacing-horizontal); + transition: background-color 0.2s linear; + background-color: rgba(0,0,0,0.06); +} +.sidebar-search-container:hover { + background-color: rgba(0,0,0,0.09); +} +.sidebar-search-container:focus-within { + background-color: rgba(0,0,0,0.12); +} + +@media (prefers-color-scheme: dark) { + .sidebar-search-container { + background-color: rgba(255,255,255,0.06); + } + .sidebar-search-container:hover { + background-color: rgba(255,255,255,0.09); + } + .sidebar-search-container:focus-within { + background-color: rgba(255,255,255,0.12); + } +} + +.sidebar-tree .toctree-l1, +.sidebar-tree .toctree-l2 { + margin: 1px 12px; + border-radius: 6px; + color: var(--link); +} + +.sidebar-tree .toctree-l1 > .reference { + color: var(--link); +} + +.sidebar-tree .toctree-l2 { + margin: 1px 0; + font-size: 90%; + text-wrap: balance; + overflow-wrap: break-word; + hyphens: manual; +} + +.sidebar-tree li > ul { + margin-left: 0; +} +.sidebar-tree li > ul .reference { + padding-left: calc(1.5*var(--sidebar-item-spacing-horizontal)); +} + +.sidebar-tree label[for^="toctree-checkbox"] { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.sidebar-tree li.toctree-l3 a { + margin: 1px 0; + padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) + var(--sidebar-item-spacing-vertical) calc(2*var(--sidebar-item-spacing-horizontal)) ; /* extra indentation */ +} + +.sidebar-tree .reference { + background: rgba(0,0,0,0); + transition: background 0.2s linear; + border-radius: 6px; + padding: var(--sidebar-item-spacing-vertical) calc(0.75*var(--sidebar-item-spacing-horizontal)); +} +.sidebar-tree .reference:hover, +.sidebar-tree .current > .reference:hover { + /* background: var(--color-background-hover); */ + background: rgba(0,0,0,0.03); +} + +.sidebar-tree .reference.current { + background: rgba(0,0,0,0.06); +} +.sidebar-tree .reference.current:hover { + background: rgba(0,0,0,0.09); +} + +.sidebar-tree .current-page > .reference { + font-weight: 600; +} + +.theme-toggle { + display: none; /* just go with auto */ +} diff --git a/doc/common-conventions.rst b/doc/common-conventions.rst index d119deb1f..524cce471 100644 --- a/doc/common-conventions.rst +++ b/doc/common-conventions.rst @@ -61,6 +61,3 @@ protocol. For other windowing systems, or if you don't have a suitable handle, just pass an empty string for "parent_window". - -.. toctree:: - :maxdepth: 2 diff --git a/doc/conf.py b/doc/conf.py index 304b51a06..3c7cbb856 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -27,7 +27,11 @@ # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output html_theme = "furo" +# add custom files that are stored in _static +html_css_files = ['xdg.css'] html_static_path = ["_static"] +html_favicon = 'img/favicon.svg' +html_logo = "img/logo.svg" # -- Options for OpenGraph --------------------------------------------------- diff --git a/doc/copy-subdir.py b/doc/copy-subdir.py new file mode 100644 index 000000000..5567f7caf --- /dev/null +++ b/doc/copy-subdir.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 + +import os, sys, shutil + +subdir = os.getenv('MESON_SUBDIR') + +input_path = os.path.join(os.getenv('MESON_SOURCE_ROOT'), subdir, sys.argv[1]) +output_path = os.path.join(os.getenv('MESON_BUILD_ROOT'), subdir, sys.argv[2]) + +os.makedirs(os.path.dirname(output_path), exist_ok=True) + +shutil.copyfile(input_path, output_path) diff --git a/doc/index.rst b/doc/index.rst index 822aee92b..52e85bb65 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -3,6 +3,11 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. +.. image:: _static/xdg-portal-light.png + :class: only-light +.. image:: _static/xdg-portal-dark.png + :class: only-dark + XDG Desktop Portal ================== diff --git a/doc/meson.build b/doc/meson.build index 1fc0a803a..ede9b7c25 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -89,4 +89,18 @@ if build_documentation build_by_default: true, depend_files: all_interfaces_xml, ) + + # Copy static files to the appropriate output subdir + copy = find_program('copy-subdir.py') + + static_files = [ + 'xdg.css', + 'inter.woff2', + 'xdg-portal-dark.png', + 'xdg-portal-light.png', + ] + + foreach f: static_files + run_command(copy, '_static' / f, 'html' / '_static' / f) + endforeach endif From 7b5a31d17a945e0658ed426cd53d1ede1655450b Mon Sep 17 00:00:00 2001 From: Kolja Lampe Date: Sat, 25 Nov 2023 01:49:07 +0100 Subject: [PATCH 54/82] Fix card --- doc/{ => _static}/card.png | Bin doc/conf.py | 6 +++--- doc/meson.build | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename doc/{ => _static}/card.png (100%) diff --git a/doc/card.png b/doc/_static/card.png similarity index 100% rename from doc/card.png rename to doc/_static/card.png diff --git a/doc/conf.py b/doc/conf.py index 3c7cbb856..d332f55b5 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -28,12 +28,12 @@ html_theme = "furo" # add custom files that are stored in _static -html_css_files = ['xdg.css'] +html_css_files = ["xdg.css"] html_static_path = ["_static"] -html_favicon = 'img/favicon.svg' +html_favicon = "img/favicon.svg" html_logo = "img/logo.svg" # -- Options for OpenGraph --------------------------------------------------- ogp_site_url = "https://flatpak.github.io/xdg-desktop-portal/docs/" -ogp_image = "card.png" +ogp_image = "_static/card.png" diff --git a/doc/meson.build b/doc/meson.build index ede9b7c25..de818ced3 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -68,7 +68,6 @@ if build_documentation 'portal-interfaces.rst', 'implementation-interfaces.rst', 'background-app-monitor.rst', - 'card.png', 'favicon.ico', ] @@ -98,6 +97,7 @@ if build_documentation 'inter.woff2', 'xdg-portal-dark.png', 'xdg-portal-light.png', + 'card.png', ] foreach f: static_files From b1a3d1ef86951689227c2418f57e3fb633de2d5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Sun, 26 Nov 2023 22:05:08 -0500 Subject: [PATCH 55/82] tests: Fix memory leaks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reenable the ASAN leak detection in CI Signed-off-by: Hubert Figuière --- .github/workflows/check.yml | 3 --- tests/backend/screenshot.c | 6 ++++-- tests/filechooser.c | 6 +++--- tests/limited-portals.c | 2 ++ 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 1030795d8..5e419074f 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -101,7 +101,6 @@ jobs: env: TEST_IN_CI: 1 G_MESSAGES_DEBUG: all - ASAN_OPTIONS: detect_leaks=0 # Right now we're not fully clean, but this gets us use-after-free etc - name: Install xdg-desktop-portal run: $RUN_CMD meson install -C ${BUILDDIR} @@ -117,7 +116,6 @@ jobs: G_MESSAGES_DEBUG: all TEST_IN_CI: 1 XDG_DATA_DIRS: /usr/local/share:/usr/share - ASAN_OPTIONS: detect_leaks=0 # Right now we're not fully clean, but this gets us use-after-free etc - name: Create dist tarball run: | @@ -126,7 +124,6 @@ jobs: env: TEST_IN_CI: 1 G_MESSAGES_DEBUG: all - ASAN_OPTIONS: detect_leaks=0 # Right now we're not fully clean, but this gets us use-after-free etc - name: Upload test logs uses: actions/upload-artifact@v3 diff --git a/tests/backend/screenshot.c b/tests/backend/screenshot.c index 3cf06c582..e0f2a6147 100644 --- a/tests/backend/screenshot.c +++ b/tests/backend/screenshot.c @@ -38,6 +38,7 @@ send_response (gpointer data) { ScreenshotHandle *handle = data; GVariantBuilder opt_builder; + g_autoptr(GVariant) params = NULL; int response; g_autofree char *uri = NULL; double red, green, blue; @@ -70,16 +71,17 @@ send_response (gpointer data) g_debug ("send response %d", response); + params = g_variant_ref_sink (g_variant_builder_end (&opt_builder)); if (handle->is_screenshot) xdp_dbus_impl_screenshot_complete_screenshot (handle->impl, handle->invocation, response, - g_variant_builder_end (&opt_builder)); + params); else xdp_dbus_impl_screenshot_complete_pick_color (handle->impl, handle->invocation, response, - g_variant_builder_end (&opt_builder)); + params); handle->timeout = 0; diff --git a/tests/filechooser.c b/tests/filechooser.c index bba88c3f1..6565d8da0 100644 --- a/tests/filechooser.c +++ b/tests/filechooser.c @@ -36,7 +36,7 @@ open_file_cb (GObject *obj, ret = xdp_portal_open_file_finish (portal, result, &error); if (response == 0) { - const char * const *uris; + g_autofree const char * const *uris = NULL; g_auto(GStrv) expected_uris = NULL; g_autofree char *expected_choices = NULL; g_autoptr(GVariant) choices = NULL; @@ -667,14 +667,14 @@ save_file_cb (GObject *obj, ret = xdp_portal_save_file_finish (portal, result, &error); if (response == 0) { - const char * const *uris; + g_autofree const char * const *uris = NULL; g_auto(GStrv) expected = NULL; g_assert_no_error (error); g_variant_lookup (ret, "uris", "^a&s", &uris); expected = g_key_file_get_string_list (keyfile, "result", "uris", NULL, NULL); - g_assert (g_strv_equal (uris, (const char * const *)expected)); + g_assert (g_strv_equal (uris, (const char * const *)expected)); } else if (response == 1) g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); diff --git a/tests/limited-portals.c b/tests/limited-portals.c index fab411abc..32deceb5e 100644 --- a/tests/limited-portals.c +++ b/tests/limited-portals.c @@ -274,6 +274,8 @@ global_setup (void) g_subprocess_launcher_setenv (launcher, "PATH", g_getenv ("PATH"), TRUE); g_subprocess_launcher_take_stdout_fd (launcher, xdup (STDERR_FILENO)); + g_clear_pointer (&argv0, g_free); + if (g_getenv ("XDP_UNINSTALLED") != NULL) argv0 = g_test_build_filename (G_TEST_BUILT, "..", XDG_DP_BUILDDIR, "xdg-desktop-portal", NULL); else From 781617a000d9f30fba6aaccec9a4f33c27c8c566 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Tue, 28 Nov 2023 22:46:49 -0300 Subject: [PATCH 56/82] restore-token: Store data with a single D-Bus call Replace the combination of set_permission_sync() + the manual call to SetValue() with a single call to Set(). This removes the unnecessary extra D-Bus call, and makes the world an tiny little bit of a better place. --- src/restore-token.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/restore-token.c b/src/restore-token.c index b084d2528..5bd1e3068 100644 --- a/src/restore-token.c +++ b/src/restore-token.c @@ -106,16 +106,22 @@ xdp_session_persistence_set_persistent_permissions (Session *session, GVariant *restore_data) { g_autoptr(GError) error = NULL; - - set_permission_sync (session->app_id, table, restore_token, PERMISSION_YES); - - if (!xdp_dbus_impl_permission_store_call_set_value_sync (get_permission_store (), - table, - TRUE, - restore_token, - g_variant_new_variant (restore_data), - NULL, - &error)) + GVariantBuilder permissions_builder; + g_auto(GStrv) permission = NULL; + + permission = permissions_from_tristate (PERMISSION_YES); + + g_variant_builder_init (&permissions_builder, G_VARIANT_TYPE ("a{sas}")); + g_variant_builder_add (&permissions_builder, "{s^a&s}", session->app_id, permission); + + if (!xdp_dbus_impl_permission_store_call_set_sync (get_permission_store (), + table, + TRUE, + restore_token, + g_variant_builder_end (&permissions_builder), + g_variant_new_variant (restore_data), + NULL, + &error)) { g_dbus_error_strip_remote_error (error); g_warning ("Error setting permission store value: %s", error->message); From 4ccef7663fa88b5ab679d540a7ab61114ab16b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Sun, 26 Nov 2023 16:02:51 -0500 Subject: [PATCH 57/82] Fix some memory leaks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also use g_autolist for convenience. Signed-off-by: Hubert Figuière --- src/camera.c | 2 +- src/email.c | 2 +- src/file-chooser.c | 2 +- src/notification.c | 2 +- src/open-uri.c | 9 ++++----- src/xdp-utils.c | 2 +- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/camera.c b/src/camera.c index 8ae36d284..c358f099d 100644 --- a/src/camera.c +++ b/src/camera.c @@ -388,7 +388,7 @@ init_camera_tracker (Camera *camera, GError **error) { g_autofree char *pipewire_socket_path = NULL; - GFile *pipewire_socket; + g_autoptr(GFile) pipewire_socket = NULL; g_autoptr(GError) local_error = NULL; pipewire_socket_path = g_strdup_printf ("%s/pipewire-0", diff --git a/src/email.c b/src/email.c index 9231c456d..224b65ca0 100644 --- a/src/email.c +++ b/src/email.c @@ -149,7 +149,7 @@ validate_email_addresses (const char *key, GVariant *options, GError **error) { - const char *const *strings = g_variant_get_strv (value, NULL); + g_autofree const char *const *strings = g_variant_get_strv (value, NULL); int i; for (i = 0; strings[i]; i++) diff --git a/src/file-chooser.c b/src/file-chooser.c index 795604ced..80f66cccb 100644 --- a/src/file-chooser.c +++ b/src/file-chooser.c @@ -76,7 +76,7 @@ send_response_in_thread_func (GTask *task, guint response; GVariant *options; DocumentFlags flags = DOCUMENT_FLAG_WRITABLE | DOCUMENT_FLAG_DIRECTORY; - const char **uris; + g_autofree char **uris = NULL; GVariant *choices; GVariant *current_filter; GVariant *writable; diff --git a/src/notification.c b/src/notification.c index 523c65164..1d6da2184 100644 --- a/src/notification.c +++ b/src/notification.c @@ -571,7 +571,7 @@ name_owner_changed (GDBusConnection *connection, { const char *name, *from, *to; - g_variant_get (parameters, "(sss)", &name, &from, &to); + g_variant_get (parameters, "(&s&s&s)", &name, &from, &to); if (name[0] == ':' && strcmp (name, from) == 0 && diff --git a/src/open-uri.c b/src/open-uri.c index 52202ac96..f569a5f41 100644 --- a/src/open-uri.c +++ b/src/open-uri.c @@ -505,8 +505,9 @@ find_recommended_choices (const char *scheme, GStrv *choices, guint *choices_len) { - GAppInfo *info; - GList *infos, *l; + g_autoptr(GAppInfo) info = NULL; + g_autolist(GAppInfo) infos = NULL; + GList *l; guint n_choices = 0; GStrv result = NULL; int i; @@ -533,11 +534,9 @@ find_recommended_choices (const char *scheme, result = g_new (char *, n_choices + 1); for (l = infos, i = 0; l; l = l->next) { - info = l->data; - result[i++] = get_app_id (info); + result[i++] = get_app_id (G_APP_INFO (l->data)); } result[i] = NULL; - g_list_free_full (infos, g_object_unref); { g_autofree char *a = g_strjoinv (", ", result); diff --git a/src/xdp-utils.c b/src/xdp-utils.c index 736e57c09..eb59444a4 100644 --- a/src/xdp-utils.c +++ b/src/xdp-utils.c @@ -1028,7 +1028,7 @@ xdp_filter_options (GVariant *options, } } - g_variant_builder_add (filtered, "{sv}", supported_options[i].key, g_steal_pointer (&value)); + g_variant_builder_add (filtered, "{sv}", supported_options[i].key, value); } return ret; From 067e0e589bdfca4f623b77d1adbf1b47334024f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Mon, 27 Nov 2023 20:27:06 -0500 Subject: [PATCH 58/82] Fix more memory leaks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Triggered by remote desktop and screencast Signed-off-by: Hubert Figuière --- src/restore-token.c | 10 +++++----- src/session.c | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/restore-token.c b/src/restore-token.c index 5bd1e3068..cbe26c8de 100644 --- a/src/restore-token.c +++ b/src/restore-token.c @@ -192,7 +192,7 @@ xdp_session_persistence_replace_restore_token_with_data (Session *session, g_variant_builder_init (&options_builder, G_VARIANT_TYPE_VARDICT); - while (g_variant_iter_next (&options_iter, "{sv}", &key, &value)) + while (g_variant_iter_next (&options_iter, "{&sv}", &key, &value)) { if (g_strcmp0 (key, "restore_token") == 0) { @@ -242,11 +242,10 @@ xdp_session_persistence_replace_restore_token_with_data (Session *session, else { g_variant_builder_add (&options_builder, "{sv}", - key, g_variant_ref (value)); + key, value); } - g_free (key); - g_variant_unref (value); + g_clear_pointer (&value, g_variant_unref); } *in_out_options = g_variant_builder_end (&options_builder); @@ -336,7 +335,7 @@ xdp_session_persistence_replace_restore_data_with_token (Session *session, { if (g_variant_check_format_string (value, RESTORE_DATA_TYPE, FALSE)) { - *in_out_restore_data = g_variant_ref_sink (value); + *in_out_restore_data = g_variant_ref (value); found_restore_data = TRUE; } else @@ -355,6 +354,7 @@ xdp_session_persistence_replace_restore_data_with_token (Session *session, { g_variant_builder_add (&results_builder, "{sv}", key, value); } + g_clear_pointer (&value, g_variant_unref); } if (found_restore_data) diff --git a/src/session.c b/src/session.c index 003995b98..2c9e1c732 100644 --- a/src/session.c +++ b/src/session.c @@ -463,6 +463,7 @@ session_finalize (GObject *object) g_free (session->app_id); g_free (session->id); + g_free (session->token); g_mutex_clear (&session->mutex); From 41be8ed2cf324a045c487d2b329b2a07e4d7e8cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Mon, 27 Nov 2023 21:04:00 -0500 Subject: [PATCH 59/82] location: Fix a memory leak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hubert Figuière --- src/location.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/location.c b/src/location.c index 0fc9df540..99a69a9d4 100644 --- a/src/location.c +++ b/src/location.c @@ -214,7 +214,7 @@ location_session_start (LocationSession *loc_session) return FALSE; } - g_variant_get (ret, "(o)", &client_id); + g_variant_get (ret, "(&o)", &client_id); loc_session->client = geoclue_client_proxy_new_sync (system_bus, G_DBUS_PROXY_FLAGS_NONE, From 3f7258ed00cfc9a80431bff69e0681c9fdcf1a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Mon, 27 Nov 2023 21:04:13 -0500 Subject: [PATCH 60/82] background: Fix a memory leak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hubert Figuière --- src/background.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/background.c b/src/background.c index b10ba7d9c..b302fdb3c 100644 --- a/src/background.c +++ b/src/background.c @@ -137,7 +137,7 @@ static Permission get_one_permission (const char *app_id, GVariant *perms) { - const char **permissions; + g_autofree const char **permissions = NULL; if (perms == NULL) { From 49cb3a4ab91d83070a8b9348bfd29e8eb901a8cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Wed, 29 Nov 2023 22:35:12 -0500 Subject: [PATCH 61/82] validate-icon: fix memory leaks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hubert Figuière --- src/validate-icon.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/validate-icon.c b/src/validate-icon.c index 249bf26da..b8c9bda31 100644 --- a/src/validate-icon.c +++ b/src/validate-icon.c @@ -43,7 +43,7 @@ validate_icon (const char *arg_width, GdkPixbufFormat *format; int max_width, max_height; int width, height; - const char *name; + g_autofree char *name = NULL; const char *allowed_formats[] = { "png", "jpeg", "svg", NULL }; g_autoptr(GdkPixbuf) pixbuf = NULL; g_autoptr(GError) error = NULL; @@ -259,8 +259,8 @@ static GOptionEntry entries[] = { int main (int argc, char *argv[]) { - GOptionContext *context; - GError *error = NULL; + g_autoptr(GOptionContext) context = NULL; + g_autoptr(GError) error = NULL; context = g_option_context_new ("WIDTH HEIGHT PATH"); g_option_context_add_main_entries (context, entries, NULL); From 01f7c54e56705b67605e0a0f43641916869a4470 Mon Sep 17 00:00:00 2001 From: tytan652 Date: Sat, 9 Dec 2023 19:43:24 +0100 Subject: [PATCH 62/82] doc: Fix broken rST refs --- data/org.freedesktop.impl.portal.Access.xml | 6 ++-- .../org.freedesktop.impl.portal.Clipboard.xml | 8 ++--- ...reedesktop.impl.portal.DynamicLauncher.xml | 4 +-- ...rg.freedesktop.impl.portal.FileChooser.xml | 28 ++++++++--------- ...reedesktop.impl.portal.GlobalShortcuts.xml | 22 +++++++------- data/org.freedesktop.impl.portal.Inhibit.xml | 8 ++--- ...g.freedesktop.impl.portal.InputCapture.xml | 30 +++++++++---------- ...g.freedesktop.impl.portal.Notification.xml | 2 +- data/org.freedesktop.impl.portal.Print.xml | 2 +- ....freedesktop.impl.portal.RemoteDesktop.xml | 12 ++++---- ...org.freedesktop.impl.portal.ScreenCast.xml | 6 ++-- data/org.freedesktop.portal.Account.xml | 2 +- data/org.freedesktop.portal.Background.xml | 2 +- data/org.freedesktop.portal.Camera.xml | 2 +- data/org.freedesktop.portal.Clipboard.xml | 4 +-- ...org.freedesktop.portal.DynamicLauncher.xml | 2 +- data/org.freedesktop.portal.FileChooser.xml | 6 ++-- ...org.freedesktop.portal.GlobalShortcuts.xml | 12 ++++---- data/org.freedesktop.portal.Inhibit.xml | 6 ++-- data/org.freedesktop.portal.InputCapture.xml | 10 +++---- data/org.freedesktop.portal.Location.xml | 4 +-- data/org.freedesktop.portal.Print.xml | 2 +- data/org.freedesktop.portal.RemoteDesktop.xml | 30 +++++++++---------- data/org.freedesktop.portal.ScreenCast.xml | 18 +++++------ data/org.freedesktop.portal.Screenshot.xml | 4 +-- data/org.freedesktop.portal.Secret.xml | 2 +- 26 files changed, 117 insertions(+), 117 deletions(-) diff --git a/data/org.freedesktop.impl.portal.Access.xml b/data/org.freedesktop.impl.portal.Access.xml index 4fe3f5412..be67af83a 100644 --- a/data/org.freedesktop.impl.portal.Access.xml +++ b/data/org.freedesktop.impl.portal.Access.xml @@ -37,7 +37,7 @@ @subtitle: Subtitle for the dialog @body: Body text, may be "" @options: Vardict with optional further information - @response: Numeric response. The values allowed match the values allowed for #org.freedesktop.portal.Request::Response signal. + @response: Numeric response. The values allowed match the values allowed for :ref:`org.freedesktop.portal.Request::Response` signal. @results: Vardict with the results of the call Presents a "deny/grant" question to the user. @@ -63,14 +63,14 @@ * ``choices`` (``a(ssa(ss)s)``) List of serialized choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. The following results get returned via the @results vardict: * ``choices`` (``a(ss)``) An array of pairs of strings, corresponding to the passed-in choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. --> diff --git a/data/org.freedesktop.impl.portal.Clipboard.xml b/data/org.freedesktop.impl.portal.Clipboard.xml index 50e2f6b6b..1645faf19 100644 --- a/data/org.freedesktop.impl.portal.Clipboard.xml +++ b/data/org.freedesktop.impl.portal.Clipboard.xml @@ -36,7 +36,7 @@ This portal does NOT create it's own session. Instead, it offers existing sessions created from other portals the option to integrate with the clipboard. For whether this interface is supported for a given session, refer to that portal's documentation. - See #org.freedesktop.portal.RemoteDesktop to integrate clipboard with the + See :ref:`org.freedesktop.portal.RemoteDesktop` to integrate clipboard with the remote desktop session. --> @@ -51,7 +51,7 @@ Sets the owner of the clipboard formats in 'mime_types' in @options to the session, i.e. this session has data for the advertised clipboard formats. - See #org.freedesktop.portal.FileTransfer to transfer files using the + See :ref:`org.freedesktop.portal.FileTransfer` to transfer files using the 'application/vnd.portal.filetransfer' mimetype. May only be called if clipboard access was given after starting the session. @@ -150,10 +150,10 @@ Notifies the session of a request for clipboard content of the given mime type. The callee provides a serial to track the request, which any - org.freedesktop.portal.Clipboard.SelectionWrite() responses must use. + :ref:`org.freedesktop.portal.Clipboard.SelectionWrite` responses must use. Once the caller is done handling the 'SelectionTransfer' request, they must call - org.freedesktop.portal.Clipboard.SelectionWriteDone() with the corresponding request's serial + :ref:`org.freedesktop.portal.Clipboard.SelectionWriteDone` with the corresponding request's serial and whether the request completed successfully. If the request is not handled, the caller should respond by setting 'success' to 'false'. diff --git a/data/org.freedesktop.impl.portal.DynamicLauncher.xml b/data/org.freedesktop.impl.portal.DynamicLauncher.xml index 3551da652..2c34456d2 100644 --- a/data/org.freedesktop.impl.portal.DynamicLauncher.xml +++ b/data/org.freedesktop.impl.portal.DynamicLauncher.xml @@ -99,9 +99,9 @@ The @response returned by this method is used to determine whether to give an install token to the caller, which can be used to avoid the need for a confirmation dialog; the token can be passed to the - org.freedesktop.portal.DynamicLauncher.Install() method just as if it + :ref:`org.freedesktop.portal.DynamicLauncher.Install` method just as if it were acquired via the - org.freedesktop.portal.DynamicLauncher.PrepareInstall() method. + :ref:`org.freedesktop.portal.DynamicLauncher.PrepareInstall` method. It is up to the portal implementation to decide whether this method is allowed based on the @app_id of the caller. diff --git a/data/org.freedesktop.impl.portal.FileChooser.xml b/data/org.freedesktop.impl.portal.FileChooser.xml index b90569282..22b34b6a1 100644 --- a/data/org.freedesktop.impl.portal.FileChooser.xml +++ b/data/org.freedesktop.impl.portal.FileChooser.xml @@ -64,22 +64,22 @@ * ``filters`` (``a(sa(us))``) A list of serialized file filters. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. * ``current_filter`` (``(sa(us))``) Request that this filter be set by default at dialog creation. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. * ``choices`` (``a(ssa(ss)s)``) A list of serialized combo boxes. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. * ``current_folder`` (``ay``) A suggested folder to open the files from. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. The following results get returned via the @results vardict: @@ -91,12 +91,12 @@ * ``choices`` (``a(ss)``) An array of pairs of strings, corresponding to the passed-in choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. * ``current_filter`` (``(sa(us))``) The filter that was selected. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. * ``writable`` (``b``) @@ -142,17 +142,17 @@ * ``filters`` (``a(sa(us))``) A list of serialized file filters. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. * ``current_filter`` (``(sa(us))``) Request that this filter be set by default at dialog creation. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. * ``choices`` (``a(ssa(ss)s)``) A list of serialized combo boxes. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. * ``current_name`` (``s``) @@ -176,12 +176,12 @@ * ``choices`` (``a(ss)``) An array of pairs of strings, corresponding to the passed-in choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. * ``current_filter`` (``(sa(us))``) The filter that was selected. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. --> @@ -230,7 +230,7 @@ * ``choices`` (``a(ssa(ss)s)``) List of serialized combo boxes. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. * ``current_folder`` (``ay``) @@ -243,7 +243,7 @@ arrays are expected to be null-terminated. The following results get returned via the - #org.freedesktop.portal.Request::Response signal: + :ref:`org.freedesktop.portal.Request::Response` signal: * ``uris`` (``as``) @@ -257,7 +257,7 @@ * ``choices`` (``a(ss)``) An array of pairs of strings, corresponding to the passed-in choices. - See org.freedesktop.portal.FileChooser.OpenFile() for details. + See :ref:`org.freedesktop.portal.FileChooser.OpenFile` for details. --> diff --git a/data/org.freedesktop.impl.portal.GlobalShortcuts.xml b/data/org.freedesktop.impl.portal.GlobalShortcuts.xml index 004d3ae24..420d69467 100644 --- a/data/org.freedesktop.impl.portal.GlobalShortcuts.xml +++ b/data/org.freedesktop.impl.portal.GlobalShortcuts.xml @@ -32,9 +32,9 @@ @@ -89,7 +89,7 @@ @@ -153,8 +153,8 @@ Emitted when shortcuts are changed. - The results get returned via the #org.freedesktop.portal.Request::Response - signal. See org.freedesktop.portal.GlobalShortcuts.BindShortcuts() for the + The results get returned via the :ref:`org.freedesktop.portal.Request::Response` + signal. See :ref:`org.freedesktop.portal.GlobalShortcuts.BindShortcuts` for the list of supported properties of shortcuts. --> diff --git a/data/org.freedesktop.impl.portal.Inhibit.xml b/data/org.freedesktop.impl.portal.Inhibit.xml index b6aabbd73..443225e43 100644 --- a/data/org.freedesktop.impl.portal.Inhibit.xml +++ b/data/org.freedesktop.impl.portal.Inhibit.xml @@ -38,7 +38,7 @@ Inhibits session status changes. As a side-effect of this call, a :ref:`org.freedesktop.impl.portal.Request` object is exported on the object path @handle. To end the inhibition, call - org.freedesktop.impl.portal.Request.Close() on that object. + :ref:`org.freedesktop.impl.portal.Request.Close` on that object. The flags determine what changes are inhibited: @@ -65,7 +65,7 @@ diff --git a/data/org.freedesktop.impl.portal.InputCapture.xml b/data/org.freedesktop.impl.portal.InputCapture.xml index 08601bb19..06943d81e 100644 --- a/data/org.freedesktop.impl.portal.InputCapture.xml +++ b/data/org.freedesktop.impl.portal.InputCapture.xml @@ -23,7 +23,7 @@ The Capture Input portal allows clients to capture input from local devices. This portal is mostly a 1:1 mapping of the - #org.freedesktop.portal.InputCapture portal, see that portal's + :ref:`org.freedesktop.portal.InputCapture` portal, see that portal's documentation for details on methods, signals and arguments. This documentation describes version 1 of this interface. @@ -32,7 +32,7 @@ @@ -245,7 +245,7 @@ diff --git a/data/org.freedesktop.impl.portal.Notification.xml b/data/org.freedesktop.impl.portal.Notification.xml index 0058f2b6e..3e93ebbe0 100644 --- a/data/org.freedesktop.impl.portal.Notification.xml +++ b/data/org.freedesktop.impl.portal.Notification.xml @@ -40,7 +40,7 @@ the notification is replaced by the new one. The format of the @notification is the same as for - org.freedesktop.portal.Notification.AddNotification(). + :ref:`org.freedesktop.portal.Notification.AddNotification`. --> diff --git a/data/org.freedesktop.impl.portal.Print.xml b/data/org.freedesktop.impl.portal.Print.xml index f5d0de673..5d7fd90d7 100644 --- a/data/org.freedesktop.impl.portal.Print.xml +++ b/data/org.freedesktop.impl.portal.Print.xml @@ -111,7 +111,7 @@ Token that can be passed to a subsequent org.freedesktop.impl.portal.Print.Print() call to bypass the print dialog. - The org.freedesktop.portal.Print.Print() documentation has details about + The :ref:`org.freedesktop.portal.Print.Print` documentation has details about the supported keys in settings and page-setup. --> diff --git a/data/org.freedesktop.impl.portal.RemoteDesktop.xml b/data/org.freedesktop.impl.portal.RemoteDesktop.xml index 97f528f61..b4e8102b9 100644 --- a/data/org.freedesktop.impl.portal.RemoteDesktop.xml +++ b/data/org.freedesktop.impl.portal.RemoteDesktop.xml @@ -60,7 +60,7 @@ @@ -337,7 +337,7 @@ Notify about a new touch down event. The (x, y) position represents the new touch point position in the streams logical coordinate space (see the ``logical_size`` stream property in - #org.freedesktop.portal.ScreenCast). + :ref:`org.freedesktop.portal.ScreenCast`). --> @@ -362,7 +362,7 @@ Notify about a new touch motion event. The (x, y) position represents where the touch point position in the streams logical coordinate space moved (see the ``logical_size`` stream property in - #org.freedesktop.portal.ScreenCast). + :ref:`org.freedesktop.portal.ScreenCast`). --> diff --git a/data/org.freedesktop.impl.portal.ScreenCast.xml b/data/org.freedesktop.impl.portal.ScreenCast.xml index 1b7285e35..222357ae5 100644 --- a/data/org.freedesktop.impl.portal.ScreenCast.xml +++ b/data/org.freedesktop.impl.portal.ScreenCast.xml @@ -29,7 +29,7 @@ diff --git a/data/org.freedesktop.portal.Clipboard.xml b/data/org.freedesktop.portal.Clipboard.xml index 048bc0478..652a11cf5 100644 --- a/data/org.freedesktop.portal.Clipboard.xml +++ b/data/org.freedesktop.portal.Clipboard.xml @@ -38,7 +38,7 @@ This portal does NOT create it's own session. Instead, it offers existing sessions created from other portals the option to integrate with the clipboard. For whether this interface is supported for a given session, refer to that portal's documentation. - See #org.freedesktop.portal.RemoteDesktop to integrate clipboard with the + See :ref:`org.freedesktop.portal.RemoteDesktop` to integrate clipboard with the remote desktop session. --> @@ -53,7 +53,7 @@ Sets the owner of the clipboard formats in ``mime_types`` in @options to the session, i.e. this session has data for the advertised clipboard formats. - See #org.freedesktop.portal.FileTransfer to transfer files using the + See :ref:`org.freedesktop.portal.FileTransfer` to transfer files using the ``application/vnd.portal.filetransfer`` mimetype. May only be called if clipboard access was given after starting the session. diff --git a/data/org.freedesktop.portal.DynamicLauncher.xml b/data/org.freedesktop.portal.DynamicLauncher.xml index abd5771b2..9dd6014db 100644 --- a/data/org.freedesktop.portal.DynamicLauncher.xml +++ b/data/org.freedesktop.portal.DynamicLauncher.xml @@ -138,7 +138,7 @@ If true, the user will be able to edit the icon of the launcher, if the implementation supports this. Defaults to false. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``name`` (``s``) diff --git a/data/org.freedesktop.portal.FileChooser.xml b/data/org.freedesktop.portal.FileChooser.xml index 0c35dcf7f..586353db4 100644 --- a/data/org.freedesktop.portal.FileChooser.xml +++ b/data/org.freedesktop.portal.FileChooser.xml @@ -128,7 +128,7 @@ The portal implementation is free to ignore this option. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``uris`` (``as``) @@ -218,7 +218,7 @@ system. The byte array is expected to be terminated by a nul byte. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``uris`` (``as``) @@ -309,7 +309,7 @@ The following results get returned via the - #org.freedesktop.portal.Request::Response signal: + :ref:`org.freedesktop.portal.Request::Response` signal: * ``uris`` (``as``) diff --git a/data/org.freedesktop.portal.GlobalShortcuts.xml b/data/org.freedesktop.portal.GlobalShortcuts.xml index ce6c8641d..8499ad2d5 100644 --- a/data/org.freedesktop.portal.GlobalShortcuts.xml +++ b/data/org.freedesktop.portal.GlobalShortcuts.xml @@ -63,7 +63,7 @@ object path element. See the org.freedesktop.portal.Session documentation for more information about the session handle. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``session_handle`` (``o``) @@ -110,7 +110,7 @@ :ref:`org.freedesktop.portal.Request` documentation for more information about the @handle. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the ref::`org.freedesktop.portal.Request::Response` signal: * ``shortcuts`` (``a(sa{sv})``) @@ -118,7 +118,7 @@ below, and is different from the @shortcuts variable of this method. Each element of the @shortcuts array returned by the - #org.freedesktop.portal.Request::Response signal is a tuple composed of + :ref:`org.freedesktop.portal.Request::Response` signal is a tuple composed of a shortcut id, and a vardict with the following keys: * ``description`` (``s``) @@ -157,13 +157,13 @@ :ref:`org.freedesktop.portal.Request` documentation for more information about the @handle. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``shortcuts`` (``a(sa{sv})``) A list of shortcuts. - See the #org.freedesktop.portal.Request::Response signal of the + See the :ref:`org.freedesktop.portal.Request::Response` signal of the org.freedesktop.portal.GlobalShortcuts.BindShortcuts() method for the list of supported properties of shortcuts. --> @@ -215,7 +215,7 @@ Indicates that the information associated with some of the shortcuts has changed. - See the #org.freedesktop.portal.Request::Response signal of the + See the :ref:`org.freedesktop.portal.Request::Response` signal of the org.freedesktop.portal.GlobalShortcuts.BindShortcuts() method for the list of supported properties of shortcuts. --> diff --git a/data/org.freedesktop.portal.Inhibit.xml b/data/org.freedesktop.portal.Inhibit.xml index 8a1076d34..c04457350 100644 --- a/data/org.freedesktop.portal.Inhibit.xml +++ b/data/org.freedesktop.portal.Inhibit.xml @@ -37,7 +37,7 @@ @handle: Object path for the :ref:`org.freedesktop.portal.Request` object representing this call Inhibits a session status changes. To remove the inhibition, - call org.freedesktop.portal.Request.Close() on the returned + call :ref:`org.freedesktop.portal.Request.Close` on the returned handle. The flags determine what changes are inhibited: @@ -79,7 +79,7 @@ A successfully created session can at any time be closed using org.freedesktop.portal.Session::Close, or may at any time be closed by the portal implementation, which will be signalled via - #org.freedesktop.portal.Session::Closed. + :ref:`org.freedesktop.portal.Session::Closed`. Supported keys in the @options vardict include: @@ -95,7 +95,7 @@ object path element. See the :ref:`org.freedesktop.portal.Session` documentation for more information about the session handle. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``session_handle`` (``o``) diff --git a/data/org.freedesktop.portal.InputCapture.xml b/data/org.freedesktop.portal.InputCapture.xml index bc5732ca9..c48b0bc2c 100644 --- a/data/org.freedesktop.portal.InputCapture.xml +++ b/data/org.freedesktop.portal.InputCapture.xml @@ -61,9 +61,9 @@ @handle: Object path for the :ref:`org.freedesktop.portal.Request` object representing this call Create a capture input session. A successfully created session can at - any time be closed using org.freedesktop.portal.Session.Close(), or may + any time be closed using :ref:`org.freedesktop.portal.Session.Close`, or may at any time be closed by the portal implementation, which will be - signalled via #org.freedesktop.portal.Session::Closed. + signalled via :ref:`org.freedesktop.portal.Session::Closed`. Supported keys in the @options vardict include: @@ -84,7 +84,7 @@ Bitmask of requested capabilities, see the SupportedCapabilities property. This value is required and must not be zero. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``session_handle`` (``o``) @@ -148,7 +148,7 @@ the zone_set ID by a sensible amount to allow for wrapping detection. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``zones`` (``a(uuii)``) @@ -239,7 +239,7 @@ pointer barrier must have y1 == y2, a vertical pointer barrier must have x1 == x2. Diagonal pointer barriers are not supported. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``failed_barriers`` (``au``) diff --git a/data/org.freedesktop.portal.Location.xml b/data/org.freedesktop.portal.Location.xml index d7ac7bbc1..241f63124 100644 --- a/data/org.freedesktop.portal.Location.xml +++ b/data/org.freedesktop.portal.Location.xml @@ -35,9 +35,9 @@ @handle: Object path for the created :ref:`org.freedesktop.portal.Session` object Create a location session. A successfully created session can at - any time be closed using org.freedesktop.portal.Session.Close(), or may + any time be closed using :ref:`org.freedesktop.portal.Session.Close`, or may at any time be closed by the portal implementation, which will be - signalled via #org.freedesktop.portal.Session::Closed. + signalled via :ref:`org.freedesktop.portal.Session::Closed`. Supported keys in the @options vardict include: diff --git a/data/org.freedesktop.portal.Print.xml b/data/org.freedesktop.portal.Print.xml index 85637095f..c4ce44650 100644 --- a/data/org.freedesktop.portal.Print.xml +++ b/data/org.freedesktop.portal.Print.xml @@ -110,7 +110,7 @@ This option was added in version 2. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``settings`` (``a{sv}``) diff --git a/data/org.freedesktop.portal.RemoteDesktop.xml b/data/org.freedesktop.portal.RemoteDesktop.xml index 62e079f00..137466df8 100644 --- a/data/org.freedesktop.portal.RemoteDesktop.xml +++ b/data/org.freedesktop.portal.RemoteDesktop.xml @@ -38,14 +38,14 @@ A remote desktop session may only be started and stopped with this interface, but you can use the :ref:`org.freedesktop.portal.Session` object created with this - method together with certain methods on the #org.freedesktop.portal.ScreenCast and - #org.freedesktop.portal.Clipboard interfaces. Specifically, you can call - org.freedesktop.portal.ScreenCast.SelectSources() to also get screen content, - and org.freedesktop.portal.ScreenCast.OpenPipeWireRemote() to acquire a file - descriptor for a PipeWire remote. See #org.freedesktop.portal.ScreenCast for + method together with certain methods on the :ref:`org.freedesktop.portal.ScreenCast` and + :ref:`org.freedesktop.portal.Clipboard` interfaces. Specifically, you can call + :ref:`org.freedesktop.portal.ScreenCast.SelectSources` to also get screen content, + and :ref:`org.freedesktop.portal.ScreenCast.OpenPipeWireRemote` to acquire a file + descriptor for a PipeWire remote. See :ref:`org.freedesktop.portal.ScreenCast` for more information on how to use those methods. To capture clipboard content, - you can call org.freedesktop.portal.Clipboard.RequestClipboard(). See - #org.freedesktop.portal.Clipboard for more information on the clipboard + you can call :ref:`org.freedesktop.portal.Clipboard.RequestClipboard`. See + :ref:`org.freedesktop.portal.Clipboard` for more information on the clipboard integration. Supported keys in the @options vardict include: @@ -63,7 +63,7 @@ more information about the session handle. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``session_handle`` (``o``) @@ -120,7 +120,7 @@ - ``2``: Permissions persist until explicitly revoked If the permission for the session to persist is granted, a restore token will - be returned via the #org.freedesktop.portal.Request::Response signal of the + be returned via the :ref:`org.freedesktop.portal.Request::Response` signal of the start method used to start the session. This option was added in version 2 of this interface. @@ -153,7 +153,7 @@ more information about the @handle. The following results get returned via the - #org.freedesktop.portal.Request::Response signal: + :ref:`org.freedesktop.portal.Request::Response` signal: * ``devices`` (``u``) @@ -162,7 +162,7 @@ * ``clipboard_enabled`` (``b``) A boolean for whether the clipboard was enabled ('true') or not ('false'). - See the #org.freedesktop.portal.Clipboard documentation for more information. + See the :ref:`org.freedesktop.portal.Clipboard` documentation for more information. Since version 2. * ``restore_token`` (``s``) @@ -174,7 +174,7 @@ This response option was added in version 2 of this interface. If a screen cast source was selected, the results of the - #org.freedesktop.portal.ScreenCast.Start response signal may be + :ref:`org.freedesktop.portal.ScreenCast.Start` response signal may be included. --> @@ -211,7 +211,7 @@ Notify about a new absolute pointer motion event. The (x, y) position represents the new pointer position in the streams logical coordinate space (see the logical_size stream property in - #org.freedesktop.portal.ScreenCast). + :ref:`org.freedesktop.portal.ScreenCast`). --> @@ -350,7 +350,7 @@ Notify about a new touch down event. The (x, y) position represents the new touch point position in the streams logical coordinate space (see the logical_size stream property in - #org.freedesktop.portal.ScreenCast). + :ref:`org.freedesktop.portal.ScreenCast`). --> @@ -375,7 +375,7 @@ Notify about a new touch motion event. The (x, y) position represents where the touch point position in the streams logical coordinate space moved (see the logical_size stream property in - #org.freedesktop.portal.ScreenCast). + :ref:`org.freedesktop.portal.ScreenCast`). --> diff --git a/data/org.freedesktop.portal.ScreenCast.xml b/data/org.freedesktop.portal.ScreenCast.xml index e9f4b7472..cde4b71bb 100644 --- a/data/org.freedesktop.portal.ScreenCast.xml +++ b/data/org.freedesktop.portal.ScreenCast.xml @@ -32,9 +32,9 @@ @handle: Object path for the :ref:`org.freedesktop.portal.Request` object representing this call Create a screen cast session. A successfully created session can at - any time be closed using org.freedesktop.portal.Session.Close(), or may + any time be closed using :ref:`org.freedesktop.portal.Session.Close`, or may at any time be closed by the portal implementation, which will be - signalled via #org.freedesktop.portal.Session::Closed. + signalled via :ref:`org.freedesktop.portal.Session::Closed`. Supported keys in the @options vardict include: @@ -50,7 +50,7 @@ object path element. See the :ref:`org.freedesktop.portal.Session` documentation for more information about the session handle. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``session_handle`` (``o``) @@ -95,7 +95,7 @@ Determines how the cursor will be drawn in the screen cast stream. It must be one of the cursor modes advertised in - #org.freedesktop.portal.ScreenCast.AvailableCursorModes. Setting a cursor mode + :ref:`org.freedesktop.portal.ScreenCast:AvailableCursorModes`. Setting a cursor mode not advertised will cause the screen cast session to be closed. The default cursor mode is 'Hidden'. @@ -116,7 +116,7 @@ Setting a restore_token is only allowed for screen cast sessions. Persistent remote desktop screen cast sessions can only be handled - via the #org.freedesktop.portal.RemoteDesktop interface. + via the :ref:`org.freedesktop.portal.RemoteDesktop` interface. This option was added in version 4 of this interface. @@ -130,11 +130,11 @@ Setting persist_mode is only allowed for screen cast sessions. Persistent remote desktop screen cast sessions can only be handled via the - #org.freedesktop.portal.RemoteDesktop interface. + :ref:`org.freedesktop.portal.RemoteDesktop` interface. If the permission for the session to persist is granted, a restore token will - be returned via the #org.freedesktop.portal.Request::Response signal of the - #org.freedesktop.portal.ScreenCast.Start method. + be returned via the :ref:`org.freedesktop.portal.Request::Response` signal of the + :ref:`org.freedesktop.portal.ScreenCast.Start` method. This option was added in version 4 of this interface. @@ -169,7 +169,7 @@ more information about the @handle. The following results get returned via the - #org.freedesktop.portal.Request::Response signal: + :ref:`org.freedesktop.portal.Request::Response` signal: * ``streams`` (``a(ua{sv})``) diff --git a/data/org.freedesktop.portal.Screenshot.xml b/data/org.freedesktop.portal.Screenshot.xml index 88618cc0f..fda966e86 100644 --- a/data/org.freedesktop.portal.Screenshot.xml +++ b/data/org.freedesktop.portal.Screenshot.xml @@ -57,7 +57,7 @@ Hint whether the dialog should offer customization before taking a screenshot. Default is no. **Since version 2.** - The following results get returned via the #org.freedesktop.portal.Request::Response + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``uri`` (``s``) @@ -85,7 +85,7 @@ object path element. See the :ref:`org.freedesktop.portal.Request` documentation for more information about the @handle. - The following results get returned via the #org.freedesktop.portal.Request::Response signal: + The following results get returned via the :ref:`org.freedesktop.portal.Request::Response` signal: * ``color`` (``(ddd)``) diff --git a/data/org.freedesktop.portal.Secret.xml b/data/org.freedesktop.portal.Secret.xml index a88710fcc..4fb81c787 100644 --- a/data/org.freedesktop.portal.Secret.xml +++ b/data/org.freedesktop.portal.Secret.xml @@ -54,7 +54,7 @@ The portal may return an additional identifier associated with the secret in the results vardict of - #org.freedesktop.portal.Request::Response signal. In the next + :ref:`org.freedesktop.portal.Request::Response` signal. In the next call of this method, the application shall indicate it through a token element in @options. From 9697b143543299b5708688ba351882e354e93719 Mon Sep 17 00:00:00 2001 From: Patrick Griffis Date: Tue, 19 Dec 2023 13:12:46 -0600 Subject: [PATCH 63/82] docs: Add more detail to the OpenDirectory() method This clarifies in more detail why you would use this over OpenFile() and how it operates in general. --- data/org.freedesktop.portal.OpenURI.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/org.freedesktop.portal.OpenURI.xml b/data/org.freedesktop.portal.OpenURI.xml index 4d9db8068..407649060 100644 --- a/data/org.freedesktop.portal.OpenURI.xml +++ b/data/org.freedesktop.portal.OpenURI.xml @@ -133,7 +133,9 @@ @options: Vardict with optional further information @handle: Object path for the :ref:`org.freedesktop.portal.Request` object representing this call - Asks to open the directory containing a local file in the file browser. + Asks to open the directory containing a local file in the file browser. This is implemented using + the ``org.freedesktop.FileManager1.ShowItems()`` D-Bus API and if that service doesn't exist falls back + to the ``OpenURI`` method on the directory of the file. Supported keys in the @options vardict include: From 2a8a4c446cfe676db620ca6a193548f124b6cc65 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Wed, 20 Dec 2023 14:32:48 -0300 Subject: [PATCH 64/82] impl-request: Do not load properties on construction The org.freedesktop.impl.portal.Request interface has no properties, and is constructed against a different object path. We don't need to fetch properties for that. Don't do that. Closes: https://github.com/flatpak/xdg-desktop-portal/issues/1241 --- src/account.c | 2 +- src/background.c | 2 +- src/device.c | 4 ++-- src/dynamic-launcher.c | 2 +- src/email.c | 2 +- src/file-chooser.c | 6 +++--- src/global-shortcuts.c | 6 +++--- src/inhibit.c | 4 ++-- src/input-capture.c | 12 ++++++------ src/location.c | 2 +- src/open-uri.c | 2 +- src/print.c | 4 ++-- src/remote-desktop.c | 7 ++++--- src/screen-cast.c | 6 +++--- src/screenshot.c | 4 ++-- src/secret.c | 2 +- src/wallpaper.c | 2 +- 17 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/account.c b/src/account.c index c404b70b5..823eec290 100644 --- a/src/account.c +++ b/src/account.c @@ -189,7 +189,7 @@ handle_get_user_information (XdpDbusAccount *object, REQUEST_AUTOLOCK (request); impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/background.c b/src/background.c index b302fdb3c..b454c4052 100644 --- a/src/background.c +++ b/src/background.c @@ -917,7 +917,7 @@ handle_request_background (XdpDbusBackground *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (access_impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (access_impl)), request->id, NULL, &error); diff --git a/src/device.c b/src/device.c index 81cbf6304..08deed113 100644 --- a/src/device.c +++ b/src/device.c @@ -150,7 +150,7 @@ device_query_permission_sync (const char *app_id, } impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -297,7 +297,7 @@ handle_access_device (XdpDbusDevice *object, g_object_set_data_full (G_OBJECT (request), "device", g_strdup (devices[0]), g_free); impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/dynamic-launcher.c b/src/dynamic-launcher.c index 556049e86..c7c50919b 100644 --- a/src/dynamic-launcher.c +++ b/src/dynamic-launcher.c @@ -600,7 +600,7 @@ handle_prepare_install (XdpDbusDynamicLauncher *object, REQUEST_AUTOLOCK (request); impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/email.c b/src/email.c index 224b65ca0..e38e8a8bc 100644 --- a/src/email.c +++ b/src/email.c @@ -219,7 +219,7 @@ handle_compose_email (XdpDbusEmail *object, REQUEST_AUTOLOCK (request); impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/file-chooser.c b/src/file-chooser.c index 80f66cccb..7e1075f33 100644 --- a/src/file-chooser.c +++ b/src/file-chooser.c @@ -571,7 +571,7 @@ handle_open_file (XdpDbusFileChooser *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -737,7 +737,7 @@ handle_save_file (XdpDbusFileChooser *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -842,7 +842,7 @@ handle_save_files (XdpDbusFileChooser *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/global-shortcuts.c b/src/global-shortcuts.c index 9faeafd33..8e40fd69a 100644 --- a/src/global-shortcuts.c +++ b/src/global-shortcuts.c @@ -238,7 +238,7 @@ handle_create_session (XdpDbusGlobalShortcuts *object, options = g_variant_builder_end (&options_builder); impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -416,7 +416,7 @@ handle_bind_shortcuts (XdpDbusGlobalShortcuts *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -531,7 +531,7 @@ handle_list_shortcuts (XdpDbusGlobalShortcuts *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/inhibit.c b/src/inhibit.c index 88afd0cc3..e64772f9d 100644 --- a/src/inhibit.c +++ b/src/inhibit.c @@ -225,7 +225,7 @@ handle_inhibit (XdpDbusInhibit *object, g_object_set_data_full (G_OBJECT (request), "options", g_variant_ref (options), (GDestroyNotify)g_variant_unref); impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -406,7 +406,7 @@ handle_create_monitor (XdpDbusInhibit *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/input-capture.c b/src/input-capture.c index 05f1cc710..f9682f1a7 100644 --- a/src/input-capture.c +++ b/src/input-capture.c @@ -240,7 +240,7 @@ handle_create_session (XdpDbusInputCapture *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -402,7 +402,7 @@ handle_get_zones (XdpDbusInputCapture *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -557,10 +557,10 @@ handle_set_pointer_barriers (XdpDbusInputCapture *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, - g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), - request->id, - NULL, &error); + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), + request->id, + NULL, &error); if (!impl_request) { g_dbus_method_invocation_return_gerror (invocation, error); diff --git a/src/location.c b/src/location.c index 99a69a9d4..9a91a7211 100644 --- a/src/location.c +++ b/src/location.c @@ -515,7 +515,7 @@ handle_start_in_thread_func (GTask *task, const char *body; impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (access_impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (access_impl)), request->id, NULL, NULL); diff --git a/src/open-uri.c b/src/open-uri.c index f569a5f41..47b789cbb 100644 --- a/src/open-uri.c +++ b/src/open-uri.c @@ -897,7 +897,7 @@ handle_open_in_thread_func (GTask *task, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, NULL); diff --git a/src/print.c b/src/print.c index a7b32c705..1e8e194b6 100644 --- a/src/print.c +++ b/src/print.c @@ -132,7 +132,7 @@ handle_print (XdpDbusPrint *object, REQUEST_AUTOLOCK (request); impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -245,7 +245,7 @@ handle_prepare_print (XdpDbusPrint *object, REQUEST_AUTOLOCK (request); impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/remote-desktop.c b/src/remote-desktop.c index 360db514f..8a33a8147 100644 --- a/src/remote-desktop.c +++ b/src/remote-desktop.c @@ -313,7 +313,7 @@ handle_create_session (XdpDbusRemoteDesktop *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -540,7 +540,7 @@ handle_select_devices (XdpDbusRemoteDesktop *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -757,7 +757,7 @@ handle_start (XdpDbusRemoteDesktop *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -1682,3 +1682,4 @@ remote_desktop_session_class_init (RemoteDesktopSessionClass *klass) quark_request_session = g_quark_from_static_string ("-xdp-request-remote-desktop-session"); } + diff --git a/src/screen-cast.c b/src/screen-cast.c index 1d10845a1..21281cb81 100644 --- a/src/screen-cast.c +++ b/src/screen-cast.c @@ -231,7 +231,7 @@ handle_create_session (XdpDbusScreenCast *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -555,7 +555,7 @@ handle_select_sources (XdpDbusScreenCast *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -892,7 +892,7 @@ handle_start (XdpDbusScreenCast *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/screenshot.c b/src/screenshot.c index 4248a9cef..3919788a4 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -302,7 +302,7 @@ handle_screenshot_in_thread_func (GTask *task, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); @@ -412,7 +412,7 @@ handle_pick_color (XdpDbusScreenshot *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/secret.c b/src/secret.c index 6f0257ba1..ac754a1c7 100644 --- a/src/secret.c +++ b/src/secret.c @@ -136,7 +136,7 @@ handle_retrieve_secret (XdpDbusSecret *object, impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); diff --git a/src/wallpaper.c b/src/wallpaper.c index 52842cc29..c4912a007 100644 --- a/src/wallpaper.c +++ b/src/wallpaper.c @@ -273,7 +273,7 @@ handle_set_wallpaper_in_thread_func (GTask *task, } impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), - G_DBUS_PROXY_FLAGS_NONE, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, g_dbus_proxy_get_name (G_DBUS_PROXY (impl)), request->id, NULL, &error); From 0bf0bee8a25913169bfebdebc161204fb2111b5e Mon Sep 17 00:00:00 2001 From: "Maximiliano Sandoval R." Date: Sun, 26 Nov 2023 10:58:54 +0100 Subject: [PATCH 65/82] device: Improve dialog text See https://gitlab.gnome.org/GNOME/xdg-desktop-portal-gnome/-/issues/35. Fixes: https://github.com/flatpak/xdg-desktop-portal/issues/1042 --- src/device.c | 51 ++++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/src/device.c b/src/device.c index 08deed113..87a954897 100644 --- a/src/device.c +++ b/src/device.c @@ -92,7 +92,6 @@ device_query_permission_sync (const char *app_id, { GVariantBuilder opt_builder; g_autofree char *title = NULL; - g_autofree char *subtitle = NULL; g_autofree char *body = NULL; guint32 response = 2; g_autoptr(GVariant) results = NULL; @@ -113,40 +112,46 @@ device_query_permission_sync (const char *app_id, { g_variant_builder_add (&opt_builder, "{sv}", "icon", g_variant_new_string ("audio-input-microphone-symbolic")); - title = g_strdup (_("Turn On Microphone?")); - body = g_strdup (_("Access to your microphone can be changed " - "at any time from the privacy settings.")); - - if (info == NULL) - subtitle = g_strdup (_("An application wants to use your microphone.")); + if (info) + { + title = g_strdup_printf (_("Allow %s to Use the Microphone?"), g_app_info_get_display_name (info)); + body = g_strdup_printf (_("%s wants to access recording devices."), g_app_info_get_display_name (info)); + } else - subtitle = g_strdup_printf (_("%s wants to use your microphone."), g_app_info_get_display_name (info)); + { + title = g_strdup (_("Allow app to Use the Microphone?")); + body = g_strdup (_("An app wants to access recording devices.")); + } } else if (strcmp (device, "speakers") == 0) { g_variant_builder_add (&opt_builder, "{sv}", "icon", g_variant_new_string ("audio-speakers-symbolic")); - title = g_strdup (_("Turn On Speakers?")); - body = g_strdup (_("Access to your speakers can be changed " - "at any time from the privacy settings.")); - - if (info == NULL) - subtitle = g_strdup (_("An application wants to play sound.")); + if (info) + { + title = g_strdup_printf (_("Allow %s to Use the Speakers?"), g_app_info_get_display_name (info)); + body = g_strdup_printf (_("%s wants to access audio devices."), g_app_info_get_display_name (info)); + } else - subtitle = g_strdup_printf (_("%s wants to play sound."), g_app_info_get_display_name (info)); + { + title = g_strdup (_("Allow app to Use the Speakers?")); + body = g_strdup (_("An app wants to access audio devices.")); + } } else if (strcmp (device, "camera") == 0) { g_variant_builder_add (&opt_builder, "{sv}", "icon", g_variant_new_string ("camera-web-symbolic")); - title = g_strdup (_("Turn On Camera?")); - body = g_strdup (_("Access to your camera can be changed " - "at any time from the privacy settings.")); - - if (info == NULL) - subtitle = g_strdup (_("An application wants to use your camera.")); + if (info) + { + title = g_strdup_printf (_("Allow %s to Use the Camera?"), g_app_info_get_display_name (info)); + body = g_strdup_printf (_("%s wants to access camera devices."), g_app_info_get_display_name (info)); + } else - subtitle = g_strdup_printf (_("%s wants to use your camera."), g_app_info_get_display_name (info)); + { + title = g_strdup (_("Allow app to Use the Camera?")); + body = g_strdup (_("An app wants to access camera devices.")); + } } impl_request = xdp_dbus_impl_request_proxy_new_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (impl)), @@ -166,7 +171,7 @@ device_query_permission_sync (const char *app_id, app_id, "", title, - subtitle, + "", body, g_variant_builder_end (&opt_builder), &response, From 61736844124b15daf979f46f395c1db9fac3c8ca Mon Sep 17 00:00:00 2001 From: Alexmelman88 <99257010+Alexmelman88@users.noreply.github.com> Date: Fri, 22 Dec 2023 22:20:51 +0300 Subject: [PATCH 66/82] Update Russian translation --- po/ru.po | 213 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 121 insertions(+), 92 deletions(-) diff --git a/po/ru.po b/po/ru.po index f263214a5..97aace51c 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,156 +6,150 @@ msgid "" msgstr "" "Project-Id-Version: xdg-desktop-portal master\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-26 11:13-0300\n" -"PO-Revision-Date: 2022-10-04 12:51+0300\n" +"Report-Msgid-Bugs-To: https://github.com/flatpak/xdg-desktop-portal/issues\n" +"POT-Creation-Date: 2023-12-22 15:33+0000\n" +"PO-Revision-Date: 2023-12-22 22:18+0300\n" "Last-Translator: Aleksandr Melman \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 3.1.1\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 3.4.1\n" -#: src/background.c:745 +#: src/background.c:747 #, c-format msgid "Allow %s to run in the background?" -msgstr "Разрешить %s работать в фоне?" +msgstr "Разрешить приложению \"%s\" работать в фоне?" -#: src/background.c:749 +#: src/background.c:751 #, c-format msgid "%s requests to be started automatically and run in the background." -msgstr "%s запрашивает доступ на автоматический запуск и работу в фоне." +msgstr "" +"Приложение \"%s\" запрашивает доступ на автоматический запуск и работу в фоне." -#: src/background.c:751 +#: src/background.c:753 #, c-format msgid "%s requests to run in the background." -msgstr "%s запрашивает доступ на работу в фоне." +msgstr "Приложение \"%s\" запрашивает доступ на работу в фоне." -#: src/background.c:752 +#: src/background.c:754 msgid "" -"The ‘run in background’ permission can be changed at any time from the " -"application settings." +"The ‘run in background’ permission can be changed at any time from the application " +"settings." msgstr "" -"Разрешение на \"работу в фоне\" может быть изменено в любое время из меню " -"настроек приложения." +"Разрешение на \"работу в фоне\" может быть изменено в любое время из меню настроек " +"приложения." -#: src/background.c:757 +#: src/background.c:759 msgid "Don't allow" msgstr "Запретить" -#: src/background.c:758 src/screenshot.c:238 src/wallpaper.c:182 +#: src/background.c:760 src/screenshot.c:238 src/wallpaper.c:183 msgid "Allow" msgstr "Разрешить" -#: src/device.c:116 -msgid "Turn On Microphone?" -msgstr "Включить микрофон?" - #: src/device.c:117 -msgid "" -"Access to your microphone can be changed at any time from the privacy " -"settings." -msgstr "" -"Доступ к микрофону может быть изменен в любое время из меню настроек " -"конфиденциальности." - -#: src/device.c:121 -msgid "An application wants to use your microphone." -msgstr "Приложение запрашивает доступ к микрофону." +#, c-format +msgid "Allow %s to Use the Microphone?" +msgstr "Разрешить приложению \"%s\" использовать микрофон?" -#: src/device.c:123 +#: src/device.c:118 #, c-format -msgid "%s wants to use your microphone." -msgstr "%s запрашивает доступ к микрофону." +msgid "%s wants to access recording devices." +msgstr "Приложение \"%s\" хочет получить доступ к записывающим устройствам." -#: src/device.c:129 -msgid "Turn On Speakers?" -msgstr "Включить динамики?" +#: src/device.c:122 +msgid "Allow app to Use the Microphone?" +msgstr "Разрешить приложению использовать микрофон?" -#: src/device.c:130 -msgid "" -"Access to your speakers can be changed at any time from the privacy settings." -msgstr "" -"Доступ к динамикам может быть изменен в любое время из меню настроек " -"конфиденциальности." +#: src/device.c:123 +msgid "An app wants to access recording devices." +msgstr "Приложение хочет получить доступ к записывающим устройствам." -#: src/device.c:134 -msgid "An application wants to play sound." -msgstr "Приложение хочет воспроизвести звук." +#: src/device.c:132 +#, c-format +msgid "Allow %s to Use the Speakers?" +msgstr "Разрешить приложению \"%s\" использовать динамики?" -#: src/device.c:136 +#: src/device.c:133 #, c-format -msgid "%s wants to play sound." -msgstr "%s хочет воспроизвести звук." +msgid "%s wants to access audio devices." +msgstr "Приложение \"%s\" хочет получить доступ к аудиоустройствам." -#: src/device.c:142 -msgid "Turn On Camera?" -msgstr "Включить камеру?" +#: src/device.c:137 +msgid "Allow app to Use the Speakers?" +msgstr "Разрешить приложению использовать динамики?" -#: src/device.c:143 -msgid "" -"Access to your camera can be changed at any time from the privacy settings." -msgstr "" -"Доступ к камере может быть изменен в любое время из меню настроек " -"конфиденциальности." +#: src/device.c:138 +msgid "An app wants to access audio devices." +msgstr "Приложение хочет получить доступ к аудиоустройствам." #: src/device.c:147 -msgid "An application wants to use your camera." -msgstr "Приложение запрашивает доступ к камере." +#, c-format +msgid "Allow %s to Use the Camera?" +msgstr "Разрешить приложению \"%s\" использовать камеру?" -#: src/device.c:149 +#: src/device.c:148 #, c-format -msgid "%s wants to use your camera." -msgstr "%s запрашивает доступ к камере." +msgid "%s wants to access camera devices." +msgstr "Приложение \"%s\" хочет получить доступ к устройствам камеры." + +#: src/device.c:152 +msgid "Allow app to Use the Camera?" +msgstr "Разрешить приложению использовать камеру?" + +#: src/device.c:153 +msgid "An app wants to access camera devices." +msgstr "Приложение хочет получить доступ к устройствам камеры." -#: src/location.c:526 +#: src/location.c:527 msgid "Deny Access" -msgstr "Отклонить запрос" +msgstr "Отказать в доступе" -#: src/location.c:528 +#: src/location.c:529 msgid "Grant Access" msgstr "Предоставить доступ" -#: src/location.c:546 +#: src/location.c:551 #, c-format msgid "Give %s Access to Your Location?" -msgstr "Дать %s доступ к вашему местоположению?" +msgstr "Дать приложению \"%s\" доступ к вашему местоположению?" -#: src/location.c:551 +#: src/location.c:556 #, c-format msgid "%s wants to use your location." -msgstr "%s запрашивает доступ к использоованию сервисов геолокации." +msgstr "Приложение \"%s\" хочет использовать ваше местоположение." -#: src/location.c:559 +#: src/location.c:565 msgid "Grant Access to Your Location?" msgstr "Предоставить доступ к вашему местоположению?" -#: src/location.c:560 +#: src/location.c:566 msgid "An application wants to use your location." -msgstr "Приложение запрашивает доступ к сервисам геолокации." +msgstr "Приложение хочет использовать ваше местоположение." -#: src/location.c:563 +#: src/location.c:569 msgid "Location access can be changed at any time from the privacy settings." msgstr "" -"Доступ к сервисам местоположения может быть изменен в любое время из меню " -"настроек конфиденциальности." +"Доступ к местоположению можно изменить в любой момент в настройках " +"конфиденциальности." -#: src/screenshot.c:236 src/wallpaper.c:180 +#: src/screenshot.c:236 src/wallpaper.c:181 msgid "Deny" -msgstr "Отклонить" +msgstr "Отказать" #: src/screenshot.c:256 #, c-format msgid "Allow %s to Take Screenshots?" -msgstr "Разрешить %s делать снимки экрана?" +msgstr "Разрешить приложению \"%s\" делать снимки экрана?" #: src/screenshot.c:257 #, c-format msgid "%s wants to be able to take screenshots at any time." -msgstr "%s хочет иметь возможность делать снимки экрана в любое время." +msgstr "Приложение \"%s\" хочет иметь возможность делать снимки экрана в любое время." #: src/screenshot.c:265 msgid "Allow Applications to Take Screenshots?" @@ -165,30 +159,65 @@ msgstr "Разрешить приложениям делать снимки эк msgid "An application wants to be able to take screenshots at any time." msgstr "Приложение хочет иметь возможность делать снимки экрана в любое время." -#: src/screenshot.c:269 src/wallpaper.c:213 +#: src/screenshot.c:269 src/wallpaper.c:218 msgid "This permission can be changed at any time from the privacy settings." -msgstr "" -"Это разрешение может быть изменено в любое время из меню настроек " -"конфиденциальности." +msgstr "Это разрешение можно изменить в любой момент в настройках конфиденциальности." #: src/settings.c:127 src/settings.c:163 msgid "Requested setting not found" msgstr "Запрашиваемая настройка не найдена" -#: src/wallpaper.c:200 +#: src/wallpaper.c:205 #, c-format msgid "Allow %s to Set Backgrounds?" -msgstr "Разрешить %s устанавливать фоновые изображения?" +msgstr "Разрешить приложению \"%s\" устанавливать фоновые изображения?" -#: src/wallpaper.c:201 +#: src/wallpaper.c:206 #, c-format msgid "%s is requesting to be able to change the background image." -msgstr "%s запрашивает возможность изменения фонового изображения." +msgstr "Приложение \"%s\" запрашивает возможность изменения фонового изображения." -#: src/wallpaper.c:209 +#: src/wallpaper.c:215 msgid "Allow Applications to Set Backgrounds?" msgstr "Разрешить приложениям устанавливать фоновые изображения?" -#: src/wallpaper.c:210 +#: src/wallpaper.c:216 msgid "An application is requesting to be able to change the background image." msgstr "Приложение запрашивает возможность изменения фонового изображения." + +#~ msgid "Turn On Microphone?" +#~ msgstr "Включить микрофон?" + +#~ msgid "" +#~ "Access to your microphone can be changed at any time from the privacy settings." +#~ msgstr "" +#~ "Доступ к микрофону можно изменить в любой момент в настройках конфиденциальности." + +#~ msgid "An application wants to use your microphone." +#~ msgstr "Приложение хочет использовать микрофон." + +#, c-format +#~ msgid "%s wants to use your microphone." +#~ msgstr "Приложение \"%s\" хочет использовать микрофон." + +#~ msgid "Turn On Speakers?" +#~ msgstr "Включить динамики?" + +#~ msgid "" +#~ "Access to your speakers can be changed at any time from the privacy settings." +#~ msgstr "" +#~ "Доступ к динамикам можно изменить в любой момент в настройках конфиденциальности." + +#~ msgid "An application wants to play sound." +#~ msgstr "Приложение хочет воспроизвести звук." + +#, c-format +#~ msgid "%s wants to play sound." +#~ msgstr "Приложение \"%s\" хочет воспроизвести звук." + +#~ msgid "Turn On Camera?" +#~ msgstr "Включить камеру?" + +#~ msgid "Access to your camera can be changed at any time from the privacy settings." +#~ msgstr "" +#~ "Доступ к камере можно изменить в любой момент в настройках конфиденциальности." From d10839574ea2409d0c28e05220db1644eacf61f3 Mon Sep 17 00:00:00 2001 From: Alexmelman88 <99257010+Alexmelman88@users.noreply.github.com> Date: Fri, 22 Dec 2023 22:28:07 +0300 Subject: [PATCH 67/82] Update ru.po --- po/ru.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/po/ru.po b/po/ru.po index 97aace51c..54cc6cb29 100644 --- a/po/ru.po +++ b/po/ru.po @@ -40,7 +40,7 @@ msgid "" "The ‘run in background’ permission can be changed at any time from the application " "settings." msgstr "" -"Разрешение на \"работу в фоне\" может быть изменено в любое время из меню настроек " +"Разрешение на ‘работу в фоне’ можно изменить в любой момент в настройках " "приложения." #: src/background.c:759 From aa4aeeb5cd6c8923a208266f10d9d83f01b77952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Mon, 25 Dec 2023 12:20:55 -0500 Subject: [PATCH 68/82] test: The test were leaving '2' files behind The syntax to output to stderr was incorrect --- tests/test-document-fuse.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test-document-fuse.sh b/tests/test-document-fuse.sh index 00f603b3f..9ea15cb61 100755 --- a/tests/test-document-fuse.sh +++ b/tests/test-document-fuse.sh @@ -85,12 +85,12 @@ if [ -n "${XDP_UNINSTALLED:-}" ]; then fi # First run a basic single-thread test -echo Testing single-threaded &>2 +echo Testing single-threaded >&2 "${test_srcdir}/test-document-fuse.py" --iterations ${ITERATIONS} -v echo "ok single-threaded" # Then a bunch of copies in parallel to stress-test -echo Testing in parallel &>2 +echo Testing in parallel >&2 PIDS=() for i in $(seq ${PARALLEL_TESTS}); do "${test_srcdir}/test-document-fuse.py" --iterations ${PARALLEL_ITERATIONS} --prefix "$i" & @@ -98,6 +98,6 @@ for i in $(seq ${PARALLEL_TESTS}); do PIDS+=( "$PID" ) done -echo waiting for pids "${PIDS[@]}" &>2 +echo waiting for pids "${PIDS[@]}" >&2 wait "${PIDS[@]}" echo "ok load-test" From 9ffdeac4a63695b41340cfe6fbfbd6b2fe6bda27 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Tue, 26 Dec 2023 12:08:00 -0300 Subject: [PATCH 69/82] doc: Sort file names alphabetically No functional changes. --- doc/meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/meson.build b/doc/meson.build index de818ced3..8707607f8 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -93,11 +93,11 @@ if build_documentation copy = find_program('copy-subdir.py') static_files = [ - 'xdg.css', + 'card.png', 'inter.woff2', + 'xdg.css', 'xdg-portal-dark.png', 'xdg-portal-light.png', - 'card.png', ] foreach f: static_files From 67aefce1b907c33cbb38f0538237aa87d2f10b55 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Tue, 26 Dec 2023 12:08:52 -0300 Subject: [PATCH 70/82] doc: Add missing assets The bullet.svg and toc_bullet.svg assets were missing, add them into the doc/_static/ folder and let the copy script copy them. Closes: https://github.com/flatpak/xdg-desktop-portal/issues/1246 --- doc/_static/bullet.svg | 1 + doc/_static/toc_bullet.svg | 39 ++++++++++++++++++++++++++++++++++++++ doc/meson.build | 2 ++ 3 files changed, 42 insertions(+) create mode 100644 doc/_static/bullet.svg create mode 100644 doc/_static/toc_bullet.svg diff --git a/doc/_static/bullet.svg b/doc/_static/bullet.svg new file mode 100644 index 000000000..e75341131 --- /dev/null +++ b/doc/_static/bullet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/doc/_static/toc_bullet.svg b/doc/_static/toc_bullet.svg new file mode 100644 index 000000000..d4a77331c --- /dev/null +++ b/doc/_static/toc_bullet.svg @@ -0,0 +1,39 @@ + + + + + + + + diff --git a/doc/meson.build b/doc/meson.build index 8707607f8..eed61a0a8 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -93,8 +93,10 @@ if build_documentation copy = find_program('copy-subdir.py') static_files = [ + 'bullet.svg', 'card.png', 'inter.woff2', + 'toc_bullet.svg', 'xdg.css', 'xdg-portal-dark.png', 'xdg-portal-light.png', From 66464504ad7210219f7a98511e0dfad4ae337d75 Mon Sep 17 00:00:00 2001 From: AsciiWolf Date: Wed, 27 Dec 2023 17:44:32 +0100 Subject: [PATCH 71/82] Update Czech translation --- po/cs.po | 167 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 102 insertions(+), 65 deletions(-) diff --git a/po/cs.po b/po/cs.po index 75c654893..0ea8cfb22 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: xdg-desktop-portal master\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-26 11:13-0300\n" -"PO-Revision-Date: 2022-09-20 23:38+0200\n" +"Report-Msgid-Bugs-To: https://github.com/flatpak/xdg-desktop-portal/issues\n" +"POT-Creation-Date: 2023-12-22 15:33+0000\n" +"PO-Revision-Date: 2023-12-27 17:44+0100\n" "Last-Translator: Daniel Rusek \n" "Language-Team: Czech \n" "Language: cs\n" @@ -18,128 +18,125 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Poedit 3.4.1\n" -#: src/background.c:745 +#: src/background.c:747 #, c-format msgid "Allow %s to run in the background?" msgstr "Povolit aplikaci %s běh na pozadí?" -#: src/background.c:749 +#: src/background.c:751 #, c-format msgid "%s requests to be started automatically and run in the background." msgstr "Aplikace %s požaduje automatické spouštění a běh na pozadí." -#: src/background.c:751 +#: src/background.c:753 #, c-format msgid "%s requests to run in the background." msgstr "Aplikace %s požaduje běh na pozadí." -#: src/background.c:752 +#: src/background.c:754 msgid "" "The ‘run in background’ permission can be changed at any time from the " "application settings." msgstr "" "Oprávnění pro „běh na pozadí“ můžete kdykoliv změnit v nastavení aplikace." -#: src/background.c:757 +#: src/background.c:759 msgid "Don't allow" msgstr "Nepovolit" -#: src/background.c:758 src/screenshot.c:238 src/wallpaper.c:182 +#: src/background.c:760 src/screenshot.c:238 src/wallpaper.c:183 msgid "Allow" msgstr "Povolit" -#: src/device.c:116 -msgid "Turn On Microphone?" -msgstr "Zapnout mikrofon?" - #: src/device.c:117 -msgid "" -"Access to your microphone can be changed at any time from the privacy " -"settings." -msgstr "" -"Přístup ke svému mikrofonu můžete kdykoliv změnit v nastavení soukromí." - -#: src/device.c:121 -msgid "An application wants to use your microphone." -msgstr "Nějaká aplikace chce používat váš mikrofon." +#, c-format +msgid "Allow %s to Use the Microphone?" +msgstr "Povolit aplikaci %s používat mikrofon?" -#: src/device.c:123 +#: src/device.c:118 #, c-format -msgid "%s wants to use your microphone." -msgstr "Aplikace %s chce používat váš mikrofon." +msgid "%s wants to access recording devices." +msgstr "Aplikace %s chce přistupovat k záznamovým zařízením." -#: src/device.c:129 -msgid "Turn On Speakers?" -msgstr "Zapnout reproduktory?" +#: src/device.c:122 +msgid "Allow app to Use the Microphone?" +msgstr "Povolit aplikaci používat mikrofon?" -#: src/device.c:130 -msgid "" -"Access to your speakers can be changed at any time from the privacy settings." -msgstr "" -"Přístup ke svým reproduktorům můžete kdykoliv změnit v nastavení soukromí." +#: src/device.c:123 +msgid "An app wants to access recording devices." +msgstr "Nějaká aplikace chce přistupovat k záznamovým zařízením." -#: src/device.c:134 -msgid "An application wants to play sound." -msgstr "Nějaká aplikace chce přehrávat zvuk." +#: src/device.c:132 +#, c-format +msgid "Allow %s to Use the Speakers?" +msgstr "Povolit aplikaci %s používat reproduktory?" -#: src/device.c:136 +#: src/device.c:133 #, c-format -msgid "%s wants to play sound." -msgstr "Aplikace %s chce přehrávat zvuk." +msgid "%s wants to access audio devices." +msgstr "Aplikace %s chce přistupovat ke zvukovým zařízením." -#: src/device.c:142 -msgid "Turn On Camera?" -msgstr "Zapnout kameru?" +#: src/device.c:137 +msgid "Allow app to Use the Speakers?" +msgstr "Povolit aplikaci používat reproduktory?" -#: src/device.c:143 -msgid "" -"Access to your camera can be changed at any time from the privacy settings." -msgstr "Přístup ke své kameře můžete kdykoliv změnit v nastavení soukromí." +#: src/device.c:138 +msgid "An app wants to access audio devices." +msgstr "Nějaká aplikace chce přistupovat ke zvukovým zařízením." #: src/device.c:147 -msgid "An application wants to use your camera." -msgstr "Nějaká aplikace chce používat vaši kameru." +#, c-format +msgid "Allow %s to Use the Camera?" +msgstr "Povolit aplikaci %s používat kameru?" -#: src/device.c:149 +#: src/device.c:148 #, c-format -msgid "%s wants to use your camera." -msgstr "Aplikace %s chce používat vaši kameru." +msgid "%s wants to access camera devices." +msgstr "Aplikace %s chce přistupovat ke kamerám." + +#: src/device.c:152 +msgid "Allow app to Use the Camera?" +msgstr "Povolit aplikaci používat kameru?" -#: src/location.c:526 +#: src/device.c:153 +msgid "An app wants to access camera devices." +msgstr "Nějaká aplikace chce přistupovat ke kamerám." + +#: src/location.c:527 msgid "Deny Access" msgstr "Zamítnout přístup" -#: src/location.c:528 +#: src/location.c:529 msgid "Grant Access" msgstr "Schválit přístup" -#: src/location.c:546 +#: src/location.c:551 #, c-format msgid "Give %s Access to Your Location?" msgstr "Schválit pro %s přístup k vaší poloze?" -#: src/location.c:551 +#: src/location.c:556 #, c-format msgid "%s wants to use your location." msgstr "Aplikace %s chce použít vaši polohu." -#: src/location.c:559 +#: src/location.c:565 msgid "Grant Access to Your Location?" msgstr "Schválit přístup k vaší poloze?" -#: src/location.c:560 +#: src/location.c:566 msgid "An application wants to use your location." msgstr "Nějaká aplikace chce použít vaši polohu." -#: src/location.c:563 +#: src/location.c:569 msgid "Location access can be changed at any time from the privacy settings." msgstr "" "Přístup ke službám pro určování polohy můžete kdykoliv změnit v nastavení " "soukromí." -#: src/screenshot.c:236 src/wallpaper.c:180 +#: src/screenshot.c:236 src/wallpaper.c:181 msgid "Deny" msgstr "Zamítnout" @@ -161,7 +158,7 @@ msgstr "Povolit aplikacím pořizovat snímky obrazovky?" msgid "An application wants to be able to take screenshots at any time." msgstr "Nějaká aplikace chce mít možnost kdykoliv pořizovat snímky obrazovky." -#: src/screenshot.c:269 src/wallpaper.c:213 +#: src/screenshot.c:269 src/wallpaper.c:218 msgid "This permission can be changed at any time from the privacy settings." msgstr "Toto oprávnění můžete kdykoliv změnit v nastavení soukromí." @@ -169,20 +166,60 @@ msgstr "Toto oprávnění můžete kdykoliv změnit v nastavení soukromí." msgid "Requested setting not found" msgstr "Požadované nastavení nebylo nalezeno" -#: src/wallpaper.c:200 +#: src/wallpaper.c:205 #, c-format msgid "Allow %s to Set Backgrounds?" msgstr "Povolit aplikaci %s možnost nastavit pozadí?" -#: src/wallpaper.c:201 +#: src/wallpaper.c:206 #, c-format msgid "%s is requesting to be able to change the background image." msgstr "Aplikace %s požaduje mít možnost změnit obrázek na pozadí." -#: src/wallpaper.c:209 +#: src/wallpaper.c:215 msgid "Allow Applications to Set Backgrounds?" msgstr "Povolit aplikacím možnost nastavit pozadí?" -#: src/wallpaper.c:210 +#: src/wallpaper.c:216 msgid "An application is requesting to be able to change the background image." msgstr "Aplikace požaduje mít možnost změnit obrázek na pozadí." + +#~ msgid "Turn On Microphone?" +#~ msgstr "Zapnout mikrofon?" + +#~ msgid "" +#~ "Access to your microphone can be changed at any time from the privacy " +#~ "settings." +#~ msgstr "" +#~ "Přístup ke svému mikrofonu můžete kdykoliv změnit v nastavení soukromí." + +#~ msgid "An application wants to use your microphone." +#~ msgstr "Nějaká aplikace chce používat váš mikrofon." + +#, c-format +#~ msgid "%s wants to use your microphone." +#~ msgstr "Aplikace %s chce používat váš mikrofon." + +#~ msgid "Turn On Speakers?" +#~ msgstr "Zapnout reproduktory?" + +#~ msgid "" +#~ "Access to your speakers can be changed at any time from the privacy " +#~ "settings." +#~ msgstr "" +#~ "Přístup ke svým reproduktorům můžete kdykoliv změnit v nastavení soukromí." + +#~ msgid "An application wants to play sound." +#~ msgstr "Nějaká aplikace chce přehrávat zvuk." + +#, c-format +#~ msgid "%s wants to play sound." +#~ msgstr "Aplikace %s chce přehrávat zvuk." + +#~ msgid "Turn On Camera?" +#~ msgstr "Zapnout kameru?" + +#~ msgid "" +#~ "Access to your camera can be changed at any time from the privacy " +#~ "settings." +#~ msgstr "Přístup ke své kameře můžete kdykoliv změnit v nastavení soukromí." From 91200df0209e83915bc3f91ad07f6dbd8da2f072 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 28 Dec 2023 13:31:59 -0300 Subject: [PATCH 72/82] doc: Restructure documentation pages * Add an Introduction page * Split Common Conventions in subpages * Document various backendy things like the .portal file and the config file * Rename various pages * Add a Contributing page --- ...ortal-interfaces.rst => api-reference.rst} | 4 +- doc/backends.rst | 119 ++++++++++++++++++ doc/background-app-monitor.rst | 16 --- doc/common-conventions.rst | 66 ++-------- doc/contributing.rst | 90 +++++++++++++ ...nterfaces.rst => impl-dbus-interfaces.rst} | 13 +- doc/index.rst | 35 ++++-- doc/introduction.rst | 43 +++++++ doc/meson.build | 15 ++- doc/requests.rst | 33 +++++ doc/sessions.rst | 13 ++ doc/window-identifiers.rst | 19 +++ 12 files changed, 364 insertions(+), 102 deletions(-) rename doc/{portal-interfaces.rst => api-reference.rst} (96%) create mode 100644 doc/backends.rst delete mode 100644 doc/background-app-monitor.rst create mode 100644 doc/contributing.rst rename doc/{implementation-interfaces.rst => impl-dbus-interfaces.rst} (70%) create mode 100644 doc/introduction.rst create mode 100644 doc/requests.rst create mode 100644 doc/sessions.rst create mode 100644 doc/window-identifiers.rst diff --git a/doc/portal-interfaces.rst b/doc/api-reference.rst similarity index 96% rename from doc/portal-interfaces.rst rename to doc/api-reference.rst index 92401054e..7057851b5 100644 --- a/doc/portal-interfaces.rst +++ b/doc/api-reference.rst @@ -1,5 +1,5 @@ -D-Bus Interfaces for App Developers -=================================== +API Reference +============= Portal interfaces are available to sandboxed applications with the default filtered session bus access of Flatpak. diff --git a/doc/backends.rst b/doc/backends.rst new file mode 100644 index 000000000..18d02db3e --- /dev/null +++ b/doc/backends.rst @@ -0,0 +1,119 @@ +Portal Backends +=============== + +The separation of the portal infrastructure into frontend and backend is a clean +way to provide suitable user interfaces that fit into different desktop +environments, while sharing the portal frontend. + +The portal backends are focused on providing user interfaces and accessing +session- or host-specific APIs and resources. Details of interacting with the +containment infrastructure such as checking access, registering files in the +document portal, etc., are handled by the portal frontend. + +Portal backends can be layered together. For example, in a GNOME session, most +portal backend interfaces are implemented by the GNOME portal backend, but +the :doc:`org.freedesktop.impl.portal.Access ` +interface is implemented by GNOME Shell. + +Adding a New Backend +-------------------- + +For a new portal backend (let's call it ``foo``) to be discoverable by XDG +Desktop Portal, the following steps are necessary: + +* Implement one or more :doc:`backend D-Bus interfaces ` + in an executable. This executable must be `D-Bus activatable + `_. +* Install ``foo.portal`` file under `{DATADIR}/xdg-desktop-portal/portals`. + Usually, ``{DATADIR}`` is `/usr/share`. The syntax of the portal file is + documented below. +* Make sure the new backend is picked by XDG Desktop Portal by adding a config + file that points to the new ``foo`` portal backend. The syntax of the config + file is documented below. + +Portal (`.portal`) File +----------------------- + +Portal files are files that allow XDG Desktop Portal to know which portal +backends are available, and which backend D-Bus interfaces they implement. +They usually look like this: + +.. code-block:: + + [portal] + DBusName=org.freedesktop.impl.portal.desktop.foo + Interfaces=org.freedesktop.impl.portal.AppChooser;org.freedesktop.impl.portal.Background;org.freedesktop.impl.portal.Clipboard;org.freedesktop.impl.portal.FileChooser;org.freedesktop.impl.portal.Lockdown;org.freedesktop.impl.portal.RemoteDesktop;org.freedesktop.impl.portal.ScreenCast; + UseIn=gnome + +The following keys are supported in this file: + +* ``DBusName``: the D-Bus activation name of the portal backend service. +* ``Interfaces``: which :doc:`backend D-Bus interfaces ` + this portal backend implements. +* ``UseIn``: which desktop environments the portal backend should run. This key + is officially deprecated, and has been replaced by the config file (see below), + but it's recommended to keep it there for legacy systems. + +Configuration File +------------------ + +Desktop systems may have multiple desktop environments and portal backends +installed in parallel, and automatically picking portal backends in this situation +has proven to be a challenge. + +For this reason, XDG Desktop Portal uses a config-based matching system. Usually, +the configuration files are provided by the desktop environments themselves, so +that e.g. the GNOME-specific portal backends are picked in GNOME sessions. No +end user intervention is necessary in this case. + +Here's an example of a config file distributed by GNOME: + +.. code-block:: + + [preferred] + default=gnome;gtk; + org.freedesktop.impl.portal.Access=gnome-shell;gtk; + org.freedesktop.impl.portal.Secret=gnome-keyring; + +This file specifies that, by default, the ``gnome`` and ``gtk`` portal backends +must be used. However, specifically for :doc:`org.freedesktop.impl.portal.Access +`, the ``gnome-shell`` and ``gtk`` +portal backends must be used; and for :doc:`org.freedesktop.impl.portal.Secret +`, the ``gnome-keyring`` portal +backend must be used. + +You can read more about the config file syntax, install locations, and more, in +the portals.conf man page: + +.. toctree:: + :maxdepth: 1 + + portals.conf + +D-Bus Interfaces +---------------- + +Portal backends must implement one or more backend D-Bus interfaces. The list of +D-Bus interfaces can be found below: + +.. toctree:: + :maxdepth: 1 + + impl-dbus-interfaces + +Background Apps Monitor +----------------------- + +In addition to managing the regular interfaces that sandboxed applications +use to interfact with the host system, XDG Desktop Portal also monitors +running applications without an active window - if the portal backend +provides an implementation of the Background portal. + +This API can be used by host system services to provide rich interfaces to +manage background running applications. + + +.. toctree:: + :maxdepth: 1 + + doc-org.freedesktop.background.Monitor.rst diff --git a/doc/background-app-monitor.rst b/doc/background-app-monitor.rst deleted file mode 100644 index ba57f4055..000000000 --- a/doc/background-app-monitor.rst +++ /dev/null @@ -1,16 +0,0 @@ -Background Apps Monitoring API -============================== - -In addition to managing the regular interfaces that sandboxed applications -use to interfact with the host system, xdg-desktop-portals also monitors -running applications without an active window - if the portal backend -provides an implementation of the Background portal. - -This API can be used by host system services to provide rich interfaces to -manage background running applications. - - -.. toctree:: - :maxdepth: 1 - - doc-org.freedesktop.background.Monitor.rst diff --git a/doc/common-conventions.rst b/doc/common-conventions.rst index 524cce471..868fadae0 100644 --- a/doc/common-conventions.rst +++ b/doc/common-conventions.rst @@ -1,63 +1,13 @@ Common Conventions ================== -Requests made via portal interfaces generally involve user interaction, and -dialogs that can stay open for a long time. Therefore portal APIs don't just use -async method calls (which time out after at most 25 seconds), but instead return -results via a Response signal on :ref:`Request` -objects. +XDG Desktop Portal uses D-Bus in a slightly uncommon way, due to the potentially +long-running nature of some of its requests. These different usage patterns are +documented in the pages below: -Portal APIs don't use properties very much. This is partially because we need to -be careful about the flow of information, and partially because it would be -unexpected to have a dialog appear when you just set a property. However, every -portal has at least one version property that specifies the maximum version -supported by xdg-desktop-portal. +.. toctree:: + :maxdepth: 1 -Portal requests ---------------- - -The general flow of the portal API is that the application makes a portal -request, the portal replies to that method call with a handle (i.e. object path) -to a Request object that corresponds to the request. The object is exported on -the bus and stays alive as long as the user interaction lasts. When the user -interaction is over, the portal sends a Response signal back to the application -with the results from the interaction, if any. - -To avoid a race condition between the caller subscribing to the signal after -receiving the reply for the method call and the signal getting emitted, a -convention for Request object paths has been established that allows the caller -to subscribe to the signal before making the method call. - -Sessions --------- - -Some portal requests are connected to each other and need to be used in -sequence. The pattern we use in such cases is a :ref:`Session` -object. Just like :ref:`Request`\s, sessions are -represented by an object path, that is returned by the initial CreateSession -call of the respective portal. Subsequent calls take the object path of the -session they operate on as an argument. - -Sessions can be ended from the application side by calling the Close() method on -the session. They can also be closed from the service side, in which case the -::Closed signal is emitted on the Session object to inform the application. - -.. _window-identifiers: -Parent window identifiers -------------------------- - -Most portals interact with the user by showing dialogs. These dialogs should -generally be placed on top of the application window that triggered them. To -arrange this, the compositor needs to know about the application window. Many -portal requests expect a "parent_window" string argument for this reason. - -Under X11, the "parent_window" argument should have the form ``x11:``, -where ```` is the XID of the application window in hexadecimal notation. - -Under Wayland, it should have the form ``wayland:``, where ```` -is a surface handle obtained with the `xdg_foreign -`_ -protocol. - -For other windowing systems, or if you don't have a suitable handle, just pass -an empty string for "parent_window". + requests + sessions + window-identifiers \ No newline at end of file diff --git a/doc/contributing.rst b/doc/contributing.rst new file mode 100644 index 000000000..568f760b8 --- /dev/null +++ b/doc/contributing.rst @@ -0,0 +1,90 @@ +Contributing +============ + +Before developing features or fixing bugs, please make sure you are have done +the following: + +- Your code is not on the ``main`` branch of your fork. +- The code has been tested. +- All commit messages are properly formatted and commits squashed where + appropriate. +- You have included updates to all appropriate documentation. + +We use GitHub pull requests to review contributions. Please be kind and patient +as code reviews can be long and minutious. + + +Development +----------- + +XDG Desktop Portal usually runs as a user session service, initialized on +demand through D-Bus activation. It usually starts with the session though, +as many desktop environments try to talk to XDG Desktop Portal on startup. +XDG Desktop Portal initializes specific backends through D-Bus activation +as well. + + +Building +-------- + +To build XDG Desktop Portal, first make sure you have the build dependencies +installed through your distribution's package manager. With them installed, +run: + +.. code-block:: shell + + meson setup . _build + meson compile -C _build + +Some distributions install portal configuration files in ``/usr``, while Meson +defaults to the prefix ``/usr/local``. If the portal configuration files in your +distribution are in ``/usr/share/xdg-desktop-portal/portals``, re-configure +Meson using ``meson setup --reconfigure . _build --prefix /usr`` and compile +again. + + +Running +------- + +XDG Desktop Portal needs to own the D-Bus name and replace the user session +service that might already be running. To do so, run: + +.. code-block:: shell + + _build/src/xdg-desktop-portal --replace + +You may need to restart backends after replacing XDG Desktop Portal (please +replace ``[name]`` with the backend name, e.g. ``gnome`` or ``kde`` or ``wlr``): + +.. code-block:: shell + + systemctl --user restart xdg-desktop-portal-[name].service + +Testing +------- + +To execute the test suite present in XDG Desktop Portal, make sure you built it +with ``-Dlibportal=enabled``, and run: + +.. code-block:: shell + + meson test -C _build + +Documentation +------------- + +These instructions are for Fedora, where you will need these packages: + +.. code-block:: + + sudo dnf install json-glib-devel fuse3-devel gdk-pixbuf2-devel pipewire-devel python3-sphinx flatpak-devel python3-furo python-sphinxext-opengraph python-sphinx-copybutton + +Then you can build the website with: + +.. code-block:: shell + + meson setup . _build -Ddocumentation=enabled + ninja -C _build + +Then just load the build website into a browser of your choice from +``_build/doc/html/index.html`` \ No newline at end of file diff --git a/doc/implementation-interfaces.rst b/doc/impl-dbus-interfaces.rst similarity index 70% rename from doc/implementation-interfaces.rst rename to doc/impl-dbus-interfaces.rst index efdc2d7d5..a7e9425f3 100644 --- a/doc/implementation-interfaces.rst +++ b/doc/impl-dbus-interfaces.rst @@ -1,19 +1,10 @@ -D-Bus Interfaces for Desktop Developers -======================================= +Backend D-Bus Interfaces +======================== The backend interfaces are used by the portal frontend to carry out portal requests. They are provided by a separate process (or processes), and are not accessible to sandboxed applications. -The separation of the portal infrastructure into frontend and backend is a clean -way to provide suitable user interfaces that fit into different desktop -environments, while sharing the portal frontend. - -The portal backends are focused on providing user interfaces and accessing -session- or host-specific APIs and resources. Details of interacting with the -containment infrastructure such as checking access, registering files in the -document portal, etc., are handled by the portal frontend. - .. toctree:: :maxdepth: 1 diff --git a/doc/index.rst b/doc/index.rst index 52e85bb65..9310e4b53 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -14,25 +14,40 @@ XDG Desktop Portal XDG Desktop Portal allow `Flatpak apps `_, and other desktop containment frameworks, to interact with the system in a secure and well defined way. +This documentation covers everything you need to know to build apps that use portals, +write portal backends for your desktop environment, configure and distribute portals +as part of a distribution, as well as basic concepts and common conventions. + +The documentation pages target primarily app developers, desktop developers, and +system distributors and administrators. The contents may also be relevant to those +who have a general interest in portals. + Content Overview ---------------- -The following sections contain relevant information for **app and desktop developers**: +This documentation is made up of the following sections: -* :doc:`Background apps monitoring `: service that provides information about apps running in background to **desktop developers**. -* :doc:`Common conventions `: coding patterns and principles common when **app and desktop developers** are working with portal APIs. -* :doc:`Portal interfaces `: portals that **apps** can use to interact with the host system. -* :doc:`Portal backend interfaces `: interfaces that **desktop developers** can implement. +* :doc:`Introduction `: learn about the goals, terminology, and + reasons to use portals on your apps. +* :doc:`Common conventions `: coding patterns and principles + common when **app and desktop developers** are working with portal APIs. +* :doc:`Application API `: portal APIs that **apps** can use to + interact with the host system. +* :doc:`Portal backends `: interfaces and configuration files that + **desktop developers** can implement and install in order to write a portal + backend. +* :doc:`Background apps monitoring `: service that provides + information about apps running in background to **desktop developers**. XDG Desktop Portal backends are selected and can be configured by using one or more configuration files. :doc:`Read more about them here `. .. toctree:: - :maxdepth: 1 + :maxdepth: 2 :hidden: - portals.conf + introduction common-conventions - portal-interfaces - implementation-interfaces - background-app-monitor + api-reference + backends + contributing diff --git a/doc/introduction.rst b/doc/introduction.rst new file mode 100644 index 000000000..588f5e24d --- /dev/null +++ b/doc/introduction.rst @@ -0,0 +1,43 @@ +Introduction +============ + +XDG Desktop Portal is a session service that provides D-Bus interfaces for +sandboxed apps. These D-Bus interfaces can be used by sandboxed apps without +granting special permissions on their sandbox manifest. + +The primary goal of portals is to expose common functionality and integration +with the desktop without requiring apps to write desktop-specific code. + +Terminology +----------- + +- Frontend: the XDG Desktop Portal service itself +- Backend: desktop-specific implementation of portal interfaces +- Host system: the privileged, unsandboxed part of the system stack + +Reasons to use portals +---------------------- + +Using XDG Desktop Portal brings major advantages over writing desktop-specific +code for app developers: + +* **Strict sandbox**: portals enable sandboxed apps to access a curated set of + features from the desktop environment and the host system, without weakening + the sandbox of the app. +* **Unified code**: by using portal APIs, apps only need to write a single + desktop-agnostic code that runs on a variety of desktop environments. Portals + can be used by sandboxed and unsandboxed apps alike. App developers are + encouraged to use portal APIs even for unsandboxed apps. +* **Seamless integration**: portal backends provide cost-free integration with + the desktop. For example, simply using the :ref:`File Chooser portal` + will make apps use the file picker dialog native to the desktop environment + they're running on. +* **Permission system**: portals can restrict access to system resources through + a permission system. Permissions can be granted, revoked, and controlled + individually by the end user. This gives end users more control over apps. + +In addition to the reasons above, some desktop features are primarily - and +sometimes exclusively - available through portals. For example, the primary way +of capturing screens and windows on Wayland desktops is through the +:ref:`ScreenCast portal`, and some desktop +environments don't even expose other means to capture the screen or windows. \ No newline at end of file diff --git a/doc/meson.build b/doc/meson.build index eed61a0a8..050038e99 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -62,13 +62,18 @@ if build_documentation docs_sources = [ 'conf.py', + 'favicon.ico', - 'index.rst', + 'api-reference.rst', + 'backends.rst', 'common-conventions.rst', - 'portal-interfaces.rst', - 'implementation-interfaces.rst', - 'background-app-monitor.rst', - 'favicon.ico', + 'contributing.rst', + 'impl-dbus-interfaces.rst', + 'index.rst', + 'introduction.rst', + 'requests.rst', + 'sessions.rst', + 'window-identifiers.rst', ] copied_docs_sources = [] diff --git a/doc/requests.rst b/doc/requests.rst new file mode 100644 index 000000000..d831f0708 --- /dev/null +++ b/doc/requests.rst @@ -0,0 +1,33 @@ +Requests +======== + +Requests made via portal interfaces generally involve user interaction, and +dialogs that can stay open for a long time. Therefore portal APIs don't just use +async method calls (which time out after at most 25 seconds), but instead return +results via a ``Response`` signal on :ref:`Request ` +objects. + +Portal APIs don't use properties very much. This is partially because we need to +be careful about the flow of information, and partially because it would be +unexpected to have a dialog appear when you just set a property. However, every +portal has at least one version property that specifies the maximum version +supported by xdg-desktop-portal. + +General Flow +------------ + +The general flow of the portal API is as follows: + +1. The application makes a portal request +2. The portal replies to that method call with a handle (i.e. object path) to a + :ref:`Request ` object that corresponds to the + request +3. The object is exported on the bus and stays alive as long as the user + interaction lasts +4. When the user interaction is over, the portal sends a ``Response`` signal back + to the application with the results from the interaction, if any. + +To avoid a race condition between the caller subscribing to the signal after +receiving the reply for the method call and the signal getting emitted, a +convention for Request object paths has been established that allows the caller +to subscribe to the signal before making the method call. \ No newline at end of file diff --git a/doc/sessions.rst b/doc/sessions.rst new file mode 100644 index 000000000..90e30925f --- /dev/null +++ b/doc/sessions.rst @@ -0,0 +1,13 @@ +Sessions +======== + +Some portal requests are connected to each other and need to be used in +sequence. The pattern used in such cases is a :ref:`Session ` +object. Just like :ref:`Request `\s, sessions are +represented by an object path, that is returned by the initial ``CreateSession`` +call of the respective portal. Subsequent calls take the object path of the +session they operate on as an argument. + +Sessions can be ended from the application side by calling the ``Close()`` method +on the session. They can also be closed from the service side, in which case the +``::Closed`` signal is emitted on the Session object to inform the application. \ No newline at end of file diff --git a/doc/window-identifiers.rst b/doc/window-identifiers.rst new file mode 100644 index 000000000..017192ccb --- /dev/null +++ b/doc/window-identifiers.rst @@ -0,0 +1,19 @@ +Window Identifiers +================== + +Most portals interact with the user by showing dialogs. These dialogs should +generally be placed on top of the application window that triggered them. To +arrange this, the compositor needs to know about the application window. Many +portal requests expect a ``"parent_window"`` string argument for this reason. + +Under X11, the ``"parent_window"`` argument should have the form ``x11:``, +where ```` is the XID of the application window in hexadecimal notation. +For example, ``x11:1234``. + +Under Wayland, it should have the form ``wayland:``, where ```` +is a surface handle obtained with the `xdg_foreign +`_ +protocol. For example, ``wayland:~12l9jdl.-a``. + +For other windowing systems, or if you don't have a suitable handle, just pass +an empty string for ``"parent_window"``. \ No newline at end of file From 4b3cff25ba65671ba7b5a633b0003b57a7d8ab91 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 28 Dec 2023 13:33:14 -0300 Subject: [PATCH 73/82] data: Unify all references to Window Identifiers --- data/org.freedesktop.impl.portal.Access.xml | 2 +- data/org.freedesktop.impl.portal.Account.xml | 2 +- data/org.freedesktop.impl.portal.AppChooser.xml | 2 +- data/org.freedesktop.impl.portal.DynamicLauncher.xml | 2 +- data/org.freedesktop.impl.portal.Email.xml | 2 +- data/org.freedesktop.impl.portal.FileChooser.xml | 6 +++--- data/org.freedesktop.impl.portal.GlobalShortcuts.xml | 2 +- data/org.freedesktop.impl.portal.InputCapture.xml | 2 +- data/org.freedesktop.impl.portal.Print.xml | 4 ++-- data/org.freedesktop.impl.portal.RemoteDesktop.xml | 2 +- data/org.freedesktop.impl.portal.ScreenCast.xml | 2 +- data/org.freedesktop.impl.portal.Screenshot.xml | 4 ++-- data/org.freedesktop.impl.portal.Wallpaper.xml | 2 +- data/org.freedesktop.portal.Background.xml | 2 +- data/org.freedesktop.portal.DynamicLauncher.xml | 2 +- data/org.freedesktop.portal.Email.xml | 2 +- data/org.freedesktop.portal.FileChooser.xml | 6 +++--- data/org.freedesktop.portal.GlobalShortcuts.xml | 2 +- data/org.freedesktop.portal.InputCapture.xml | 2 +- data/org.freedesktop.portal.Location.xml | 2 +- data/org.freedesktop.portal.OpenURI.xml | 6 +++--- data/org.freedesktop.portal.Print.xml | 4 ++-- data/org.freedesktop.portal.RemoteDesktop.xml | 2 +- data/org.freedesktop.portal.ScreenCast.xml | 2 +- data/org.freedesktop.portal.Screenshot.xml | 2 +- data/org.freedesktop.portal.Wallpaper.xml | 4 ++-- 26 files changed, 36 insertions(+), 36 deletions(-) diff --git a/data/org.freedesktop.impl.portal.Access.xml b/data/org.freedesktop.impl.portal.Access.xml index be67af83a..43f6e93db 100644 --- a/data/org.freedesktop.impl.portal.Access.xml +++ b/data/org.freedesktop.impl.portal.Access.xml @@ -32,7 +32,7 @@ AccessDialog: @handle: Object path to export the Request object at @app_id: App id of the application - @parent_window: Identifier for the application window, see :ref:`Common Conventions ` + @parent_window: Identifier for the application window, see :doc:`window-identifiers` @title: Title for the dialog @subtitle: Subtitle for the dialog @body: Body text, may be "" diff --git a/data/org.freedesktop.impl.portal.Account.xml b/data/org.freedesktop.impl.portal.Account.xml index 06e55188b..f8d6fa66a 100644 --- a/data/org.freedesktop.impl.portal.Account.xml +++ b/data/org.freedesktop.impl.portal.Account.xml @@ -33,7 +33,7 @@ GetUserInformation: @handle: Object path for the :ref:`org.freedesktop.portal.Request` object representing this call @app_id: App id of the application - @window: Identifier for the application window, see :ref:`Common Conventions ` + @window: Identifier for the application window, see :doc:`window-identifiers` @options: Vardict with optional further information @response: Numeric response @results: Vardict with the results of the call diff --git a/data/org.freedesktop.impl.portal.AppChooser.xml b/data/org.freedesktop.impl.portal.AppChooser.xml index 155bfb233..e9522e4ba 100644 --- a/data/org.freedesktop.impl.portal.AppChooser.xml +++ b/data/org.freedesktop.impl.portal.AppChooser.xml @@ -33,7 +33,7 @@ @handle: Object path to export the Request object at @app_id: App id of the application @title: Title for the app chooser dialog - @parent_window: Identifier for the application window, see :ref:`Common Conventions ` + @parent_window: Identifier for the application window, see :doc:`window-identifiers` @choices: App ids of applications to let the user choose from @options: Vardict with optional further information @response: Numeric response diff --git a/data/org.freedesktop.impl.portal.DynamicLauncher.xml b/data/org.freedesktop.impl.portal.DynamicLauncher.xml index 2c34456d2..d174764dd 100644 --- a/data/org.freedesktop.impl.portal.DynamicLauncher.xml +++ b/data/org.freedesktop.impl.portal.DynamicLauncher.xml @@ -30,7 +30,7 @@ PrepareInstall: @handle: Object path for the :ref:`org.freedesktop.impl.portal.Request` object representing this call @app_id: App id of the application - @parent_window: Identifier for the application window, see :ref:`Common Conventions ` + @parent_window: Identifier for the application window, see :doc:`window-identifiers` @name: The default name for the launcher @icon_v: A #GBytesIcon as returned by g_icon_serialize() @options: Vardict with optional further information diff --git a/data/org.freedesktop.impl.portal.Email.xml b/data/org.freedesktop.impl.portal.Email.xml index 0b89d5275..b8b88f1ce 100644 --- a/data/org.freedesktop.impl.portal.Email.xml +++ b/data/org.freedesktop.impl.portal.Email.xml @@ -30,7 +30,7 @@ ComposeEmail: @handle: Object path for the :ref:`org.freedesktop.impl.portal.Request` object representing this call @app_id: App id of the application - @parent_window: Identifier for the application window, see :ref:`Common Conventions ` + @parent_window: Identifier for the application window, see :doc:`window-identifiers` @options: Vardict with optional further information @response: Numeric response @results: Vardict with the results of the call diff --git a/data/org.freedesktop.impl.portal.FileChooser.xml b/data/org.freedesktop.impl.portal.FileChooser.xml index 22b34b6a1..0cf8c4337 100644 --- a/data/org.freedesktop.impl.portal.FileChooser.xml +++ b/data/org.freedesktop.impl.portal.FileChooser.xml @@ -35,7 +35,7 @@ OpenFile: @handle: Object path for the :ref:`org.freedesktop.impl.portal.Request` object representing this call @app_id: App id of the application - @parent_window: Identifier for the application window, see :ref:`Common Conventions ` + @parent_window: Identifier for the application window, see :doc:`window-identifiers` @title: Title for the file chooser dialog @options: Vardict with optional further information @response: Numeric response @@ -117,7 +117,7 @@ SaveFile: @handle: Object path for the :ref:`org.freedesktop.impl.portal.Request` object representing this call @app_id: App id of the application - @parent_window: Identifier for the application window, see :ref:`Common Conventions ` + @parent_window: Identifier for the application window, see :doc:`window-identifiers` @title: Title for the file chooser dialog @options: Vardict with optional further information @response: Numeric response @@ -196,7 +196,7 @@ From bbdacbc0056c16535618a627ece2f89dc3b9c936 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 28 Dec 2023 17:38:36 -0300 Subject: [PATCH 77/82] data: Remove copy-pasted handle_token from docs This handle_token entry is not part of the *backend* API, only the frontend. Closes: https://github.com/flatpak/xdg-desktop-portal/issues/938 --- data/org.freedesktop.impl.portal.FileChooser.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/data/org.freedesktop.impl.portal.FileChooser.xml b/data/org.freedesktop.impl.portal.FileChooser.xml index 0cf8c4337..6668c1047 100644 --- a/data/org.freedesktop.impl.portal.FileChooser.xml +++ b/data/org.freedesktop.impl.portal.FileChooser.xml @@ -212,13 +212,6 @@ Supported keys in the @options vardict include: - * ``handle_token`` (``s``) - - A string that will be used as the last element of the - @handle. Must be a valid object path element. See the - :ref:`org.freedesktop.portal.Request` documentation for more - information about the @handle. - * ``accept_label`` (``s``) Label for the accept button. Mnemonic underlines are allowed. From 9308bcf96fe33334042fbd08b29ff54ab8c273bb Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 28 Dec 2023 23:17:27 -0300 Subject: [PATCH 78/82] doc: Improve introduction As per swick's suggestions. --- doc/introduction.rst | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/doc/introduction.rst b/doc/introduction.rst index 588f5e24d..07ae9b56e 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -1,12 +1,17 @@ Introduction ============ -XDG Desktop Portal is a session service that provides D-Bus interfaces for -sandboxed apps. These D-Bus interfaces can be used by sandboxed apps without -granting special permissions on their sandbox manifest. +XDG Desktop Portal is a session service that provides D-Bus interfaces for apps +to interact with the desktop. + +Portal interfaces can be used by sandboxed and unsandboxed apps alike, but +sandboxed apps benefit the most since they don't need special permissions to use +portal APIs. XDG Desktop Portal safeguards many resources and features with a +user-controlled permission system. The primary goal of portals is to expose common functionality and integration -with the desktop without requiring apps to write desktop-specific code. +with the desktop without requiring apps to write desktop-specific code, or +loosen their sandbox restrictions. Terminology ----------- From 5744dc33747da7cd07189fddc802ef9eac8ec463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Donk=C3=B3?= Date: Wed, 27 Dec 2023 23:32:42 +0100 Subject: [PATCH 79/82] Update the D-Bus docs URL in the help text --- src/xdg-desktop-portal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xdg-desktop-portal.c b/src/xdg-desktop-portal.c index df0b9cbf4..fdac56ef8 100644 --- a/src/xdg-desktop-portal.c +++ b/src/xdg-desktop-portal.c @@ -391,7 +391,7 @@ main (int argc, char *argv[]) "path /org/freedesktop/portal/desktop.\n" "\n" "Documentation for the available D-Bus interfaces can be found at\n" - "https://flatpak.github.io/xdg-desktop-portal/portal-docs.html\n" + "https://flatpak.github.io/xdg-desktop-portal/docs/\n" "\n" "Please report issues at https://github.com/flatpak/xdg-desktop-portal/issues"); g_option_context_add_main_entries (context, entries, NULL); From 52d070165e259348703e96f22cbf0dfb3157d50e Mon Sep 17 00:00:00 2001 From: Tau Date: Sat, 6 Jan 2024 20:17:56 +0100 Subject: [PATCH 80/82] Fix broken link to xdg_foreign protocol --- doc/window-identifiers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/window-identifiers.rst b/doc/window-identifiers.rst index 017192ccb..fd9a16bab 100644 --- a/doc/window-identifiers.rst +++ b/doc/window-identifiers.rst @@ -12,7 +12,7 @@ For example, ``x11:1234``. Under Wayland, it should have the form ``wayland:``, where ```` is a surface handle obtained with the `xdg_foreign -`_ +`_ protocol. For example, ``wayland:~12l9jdl.-a``. For other windowing systems, or if you don't have a suitable handle, just pass From d42373a97813fd80af6c90aec6a3f23073e76df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Thu, 28 Dec 2023 22:57:55 -0500 Subject: [PATCH 81/82] docs: Fix link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hubert Figuière --- doc/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/index.rst b/doc/index.rst index 9310e4b53..35757d2f2 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -31,7 +31,7 @@ This documentation is made up of the following sections: reasons to use portals on your apps. * :doc:`Common conventions `: coding patterns and principles common when **app and desktop developers** are working with portal APIs. -* :doc:`Application API `: portal APIs that **apps** can use to +* :doc:`Application API `: portal APIs that **apps** can use to interact with the host system. * :doc:`Portal backends `: interfaces and configuration files that **desktop developers** can implement and install in order to write a portal From fd70f57f49b8810e4118e80b72411356bdc4af18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Thu, 11 Jan 2024 20:50:10 -0500 Subject: [PATCH 82/82] document-portal: Minor indentation and typo fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hubert Figuière --- document-portal/document-portal-fuse.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/document-portal/document-portal-fuse.c b/document-portal/document-portal-fuse.c index 8d2e107d6..ac2014a10 100644 --- a/document-portal/document-portal-fuse.c +++ b/document-portal/document-portal-fuse.c @@ -109,7 +109,7 @@ * referenced by the dcache (Directory Entry Cache) (even though we * will not really use the dcache info due to the 0 valid time). This * is unfortunate, because it means we will keep a lot of file - * descriptor open. But, we can not know if the kernel needs the inode + * descriptors open. But, we can not know if the kernel needs the inode * for some non-dcache use so we can't close the file descriptors. * * To work around this we regularly emit entry invalidation calls @@ -947,7 +947,7 @@ verify_doc_dir_devino (int dirfd, XdpDomain *doc_domain) return -ENOENT; return 0; - } +} /* Only for toplevel dirs, not this is a bit weird for toplevel dir inodes as it returns the dir itself which isn't really the dirfd @@ -1659,7 +1659,7 @@ ensure_docdir_inode (XdpInode *parent, inode->domain_root_inode = xdp_inode_ref (parent->domain_root_inode); else inode->domain_root_inode = xdp_inode_ref (parent); - g_hash_table_insert (domain->inodes, physical, inode); + g_hash_table_insert (domain->inodes, physical, inode); } G_UNLOCK(domain_inodes); @@ -2360,7 +2360,7 @@ xdp_fuse_opendir (fuse_req_t req, } } - fi->fh = (gsize)d; + fi->fh = (gsize)d; if (fuse_reply_open (req, fi) == -ENOENT) {