From 821d9b213c965f906766cfb9e448cc6dc278a394 Mon Sep 17 00:00:00 2001 From: Polle Pas Date: Tue, 13 Aug 2024 14:24:05 +0200 Subject: [PATCH 1/4] #925 Add csv export to tables --- CHANGELOG.md | 1 + Cargo.lock | 26 +- browser/CHANGELOG.md | 1 + .../data-browser/src/components/Button.tsx | 5 +- .../src/components/ButtonLink.tsx | 17 + .../src/components/Dropdown/index.tsx | 1 - .../components/ResourceContextMenu/index.tsx | 42 ++- .../src/views/TablePage/TableExportDialog.tsx | 68 ++++ lib/Cargo.toml | 1 + lib/src/endpoints.rs | 1 + lib/src/plugins/export.rs | 19 ++ lib/src/plugins/mod.rs | 1 + lib/src/resources.rs | 9 +- lib/src/urls.rs | 1 + lib/src/values.rs | 11 +- server/src/handlers/download.rs | 3 - server/src/handlers/export.rs | 309 ++++++++++++++++++ server/src/handlers/mod.rs | 1 + server/src/routes.rs | 1 + 19 files changed, 493 insertions(+), 25 deletions(-) create mode 100644 browser/data-browser/src/components/ButtonLink.tsx create mode 100644 browser/data-browser/src/views/TablePage/TableExportDialog.tsx create mode 100644 lib/src/plugins/export.rs create mode 100644 server/src/handlers/export.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b5e43f2c..13fd8208f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ See [STATUS.md](server/STATUS.md) to learn more about which features will remain ## Unreleased - The download endpoint can now optimize images on the fly. This is controlled via query parameters. #257 +- Added export endpoint for exporting resources to other formats. Currently only supports exporting tables to csv. [#925](https://github.com/atomicdata-dev/atomic-server/issues/925) ## [v0.38.0] - 2024-06-08 diff --git a/Cargo.lock b/Cargo.lock index 215557cba..145af25f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -576,6 +576,7 @@ dependencies = [ "sled", "toml 0.8.8", "tracing", + "ulid", "ureq", "url", "urlencoding", @@ -1664,8 +1665,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -4594,7 +4597,7 @@ dependencies = [ "tracing-core", "tracing-log", "tracing-subscriber", - "web-time", + "web-time 0.2.4", ] [[package]] @@ -4627,6 +4630,17 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +[[package]] +name = "ulid" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f903f293d11f31c0c29e4148f6dc0d033a7f80cebc0282bea147611667d289" +dependencies = [ + "getrandom 0.2.11", + "rand 0.8.5", + "web-time 1.1.0", +] + [[package]] name = "unicase" version = "2.6.0" @@ -4894,6 +4908,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webp" version = "0.3.0" diff --git a/browser/CHANGELOG.md b/browser/CHANGELOG.md index f26f7ee41..950d54329 100644 --- a/browser/CHANGELOG.md +++ b/browser/CHANGELOG.md @@ -21,6 +21,7 @@ This changelog covers all five packages, as they are (for now) updated as a whol - [#861](https://github.com/atomicdata-dev/atomic-server/issues/861) Fix long usernames overflowing on the share page. - [#906](https://github.com/atomicdata-dev/atomic-server/issues/906) Reset changes after clicking the cancel button in a form or navigating away. - [#914](https://github.com/atomicdata-dev/atomic-server/issues/914) Fix an issue where changing the subject in a new resource form could update the parent of existing resources if their subject matched the new subject. +- [#925](https://github.com/atomicdata-dev/atomic-server/issues/925) Added export to CSV option to tables. - [#919](https://github.com/atomicdata-dev/atomic-server/issues/919) Automatically sort classes and properties in the ontology editor. - [#936](https://github.com/atomicdata-dev/atomic-server/issues/936) Updated the address bar to make it clearer it's also search bar. diff --git a/browser/data-browser/src/components/Button.tsx b/browser/data-browser/src/components/Button.tsx index 31be00e89..9f59ca612 100644 --- a/browser/data-browser/src/components/Button.tsx +++ b/browser/data-browser/src/components/Button.tsx @@ -165,10 +165,9 @@ export const ButtonDefault = styled(ButtonBase)` --button-text-color: ${p => p.theme.colors.bg}; --button-text-color-hover: ${p => p.theme.colors.bg}; - padding: 0.4rem; border-radius: ${p => p.theme.radius}; - padding-left: ${p => p.theme.margin}rem; - padding-right: ${p => p.theme.margin}rem; + padding-block: 0.4rem; + padding-inline: ${p => p.theme.margin}rem; display: inline-flex; background-color: var(--button-bg-color); color: var(--button-text-color); diff --git a/browser/data-browser/src/components/ButtonLink.tsx b/browser/data-browser/src/components/ButtonLink.tsx new file mode 100644 index 000000000..0f19cfe2c --- /dev/null +++ b/browser/data-browser/src/components/ButtonLink.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { ButtonDefault } from './Button'; +import styled from 'styled-components'; + +export function ButtonLink( + props: React.AnchorHTMLAttributes, +): React.JSX.Element { + return ( + + {props.children} + + ); +} + +const StyledButtonDefault = styled(ButtonDefault)` + text-decoration: none; +`; diff --git a/browser/data-browser/src/components/Dropdown/index.tsx b/browser/data-browser/src/components/Dropdown/index.tsx index d8698bf28..dab7c210a 100644 --- a/browser/data-browser/src/components/Dropdown/index.tsx +++ b/browser/data-browser/src/components/Dropdown/index.tsx @@ -394,7 +394,6 @@ const MenuItemStyled = styled(Button)` color: ${p => p.theme.colors.text}; padding: 0.4rem 1rem; height: auto; - text-transform: capitalize; background-color: ${p => p.selected ? p.theme.colors.bg1 : p.theme.colors.bg}; text-decoration: ${p => (p.selected ? 'underline' : 'none')}; diff --git a/browser/data-browser/src/components/ResourceContextMenu/index.tsx b/browser/data-browser/src/components/ResourceContextMenu/index.tsx index 43a0327c5..0ee2022c5 100644 --- a/browser/data-browser/src/components/ResourceContextMenu/index.tsx +++ b/browser/data-browser/src/components/ResourceContextMenu/index.tsx @@ -1,6 +1,12 @@ import { useCallback, useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; -import { Client, core, useCanWrite, useResource } from '@tomic/react'; +import { + Client, + core, + dataBrowser, + useCanWrite, + useResource, +} from '@tomic/react'; import { editURL, dataURL, @@ -25,6 +31,7 @@ import { FaShare, FaTrash, FaPlus, + FaFileCsv, } from 'react-icons/fa6'; import { useQueryScopeHandler } from '../../hooks/useQueryScope'; import { @@ -37,6 +44,7 @@ import { useCurrentSubject } from '../../helpers/useCurrentSubject'; import { ResourceCodeUsageDialog } from '../../views/CodeUsage/ResourceCodeUsageDialog'; import { useNewRoute } from '../../helpers/useNewRoute'; import { addIf } from '../../helpers/addIf'; +import { TableExportDialog } from '../../views/TablePage/TableExportDialog'; export enum ContextMenuOptions { View = 'view', @@ -49,6 +57,7 @@ export enum ContextMenuOptions { Import = 'import', UseInCode = 'useInCode', NewChild = 'newChild', + Export = 'export', } export interface ResourceContextMenuProps { @@ -81,6 +90,7 @@ function ResourceContextMenu({ const resource = useResource(subject); const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [showCodeUsageDialog, setShowCodeUsageDialog] = useState(false); + const [showExportDialog, setShowExportDialog] = useState(false); const handleAddClick = useNewRoute(subject); const [currentSubject] = useCurrentSubject(); const [canWrite] = useCanWrite(resource); @@ -117,14 +127,14 @@ function ResourceContextMenu({ { disabled: location.pathname.startsWith(paths.show), id: ContextMenuOptions.View, - label: 'normal view', + label: 'Normal View', helper: 'Open the regular, default View.', onClick: () => navigate(constructOpenURL(subject)), }, { disabled: location.pathname.startsWith(paths.data), id: ContextMenuOptions.Data, - label: 'data view', + label: 'Data View', helper: 'View the resource and its properties in the Data View.', shortcut: shortcuts.data, onClick: () => navigate(dataURL(subject)), @@ -136,7 +146,7 @@ function ResourceContextMenu({ { // disabled: !canWrite || location.pathname.startsWith(paths.edit), id: ContextMenuOptions.Edit, - label: 'edit', + label: 'Edit', helper: 'Open the edit form.', icon: , shortcut: simple ? '' : shortcuts.edit, @@ -144,7 +154,7 @@ function ResourceContextMenu({ }, { id: ContextMenuOptions.NewChild, - label: 'add child', + label: 'Add child', helper: 'Create a new resource under this resource.', icon: , onClick: handleAddClick, @@ -152,7 +162,7 @@ function ResourceContextMenu({ ), { id: ContextMenuOptions.UseInCode, - label: 'use in code', + label: 'Use in code', helper: 'Usage instructions for how to fetch and use the resource in your code.', icon: , @@ -160,7 +170,7 @@ function ResourceContextMenu({ }, { id: ContextMenuOptions.Scope, - label: 'search children', + label: 'Search children', helper: 'Scope search to resource', icon: , onClick: enableScope, @@ -176,7 +186,7 @@ function ResourceContextMenu({ { id: ContextMenuOptions.History, icon: , - label: 'history', + label: 'History', helper: 'Show the history of this resource', onClick: () => navigate(historyURL(subject)), }, @@ -185,7 +195,7 @@ function ResourceContextMenu({ { id: ContextMenuOptions.Import, icon: , - label: 'import', + label: 'Import', helper: 'Import Atomic Data to this resource', onClick: () => navigate(importerURL(subject)), }, @@ -193,11 +203,18 @@ function ResourceContextMenu({ disabled: !canWrite, id: ContextMenuOptions.Delete, icon: , - label: 'delete', + label: 'Delete', helper: 'Delete this resource.', onClick: () => setShowDeleteDialog(true), }, ), + ...addIf(resource.hasClasses(dataBrowser.classes.table), { + id: ContextMenuOptions.Export, + icon: , + label: 'Export to csv', + helper: 'Export the table as a CSV file', + onClick: () => setShowExportDialog(true), + }), ]; const filteredItems = showOnly @@ -237,6 +254,11 @@ function ResourceContextMenu({ + {currentSubject && ( ; +} + +const buildLink = (subject: string, refAsSubject: boolean, store: Store) => { + const url = new URL(`${store.getServerUrl()}/export`); + + url.searchParams.set('format', 'csv'); + url.searchParams.set('subject', subject); + url.searchParams.set('display_refs_as_name', refAsSubject ? 'false' : 'true'); + + return url.toString(); +}; + +export function TableExportDialog({ + subject, + show, + bindShow, +}: TableExportDialogProps): React.JSX.Element { + const store = useStore(); + const [dialogProps, showDialog] = useDialog({ bindShow }); + const [refAsSubject, setRefAsSubject] = useState(false); + + const url = buildLink(subject, refAsSubject, store); + + useEffect(() => { + if (show) { + showDialog(); + } + }, [show, showDialog]); + + return ( + <> + + +

Export table as CSV

+
+ + + {' '} + Reference resources by subject instead of name. + + + + + + Download + + +
+ + ); +} diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 8d93bdc41..3f6a68bc0 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -36,6 +36,7 @@ tracing = "0.1" ureq = "2" url = "2" urlencoding = "2" +ulid = "1.1.3" [dev-dependencies] criterion = "0.5" diff --git a/lib/src/endpoints.rs b/lib/src/endpoints.rs index bd56bb48d..c3699fd60 100644 --- a/lib/src/endpoints.rs +++ b/lib/src/endpoints.rs @@ -82,6 +82,7 @@ pub fn default_endpoints() -> Vec { plugins::search::search_endpoint(), plugins::files::upload_endpoint(), plugins::files::download_endpoint(), + plugins::export::export_endpoint(), #[cfg(feature = "html")] plugins::bookmark::bookmark_endpoint(), plugins::importer::import_endpoint(), diff --git a/lib/src/plugins/export.rs b/lib/src/plugins/export.rs new file mode 100644 index 000000000..a79daa035 --- /dev/null +++ b/lib/src/plugins/export.rs @@ -0,0 +1,19 @@ +use crate::endpoints::Endpoint; + +pub fn export_endpoint() -> Endpoint { + Endpoint { + path: "/export".to_string(), + params: vec!["subject".into(), "format".into(), "display_refs_as_name".into()], + description: r#"Export table data + +Use with the following parameters +- **subject**: Subject of the resource to export. +- **format**: Format of the export, currently only supports `csv`. +- **display_refs_as_name**: If true, it will display referenced resources by their name instead of subject. +"# + .to_string(), + shortname: "export".to_string(), + handle: None, + handle_post: None, + } +} diff --git a/lib/src/plugins/mod.rs b/lib/src/plugins/mod.rs index 31a2bdcf1..9f383bf51 100644 --- a/lib/src/plugins/mod.rs +++ b/lib/src/plugins/mod.rs @@ -41,6 +41,7 @@ pub mod invite; // Endpoints #[cfg(feature = "html")] pub mod bookmark; +pub mod export; pub mod files; pub mod path; pub mod prunetests; diff --git a/lib/src/resources.rs b/lib/src/resources.rs index 59dc990b3..f9fedbd7f 100644 --- a/lib/src/resources.rs +++ b/lib/src/resources.rs @@ -15,6 +15,7 @@ use crate::{ use serde::{Deserialize, Serialize}; use std::collections::HashMap; use tracing::instrument; +use ulid::Ulid; /// A Resource is a set of Atoms that shares a single Subject. /// A Resource only contains valid Values, but it _might_ lack required properties. @@ -209,11 +210,15 @@ impl Resource { } } + pub fn random_subject(store: &impl Storelike) -> String { + format!("{}/{}", store.get_server_url(), Ulid::new().to_string()) + } + /// Create a new resource with a generated Subject pub fn new_generate_subject(store: &impl Storelike) -> Resource { - let generated = format!("{}/{}", store.get_server_url(), random_string(10)); + let subject = Resource::random_subject(store); - Resource::new(generated) + Resource::new(subject) } /// Create a new instance of some Class. diff --git a/lib/src/urls.rs b/lib/src/urls.rs index 03588c291..7ba27457f 100644 --- a/lib/src/urls.rs +++ b/lib/src/urls.rs @@ -22,6 +22,7 @@ pub const BOOKMARK: &str = "https://atomicdata.dev/class/Bookmark"; pub const ONTOLOGY: &str = "https://atomicdata.dev/class/ontology"; pub const ENDPOINT_RESPONSE: &str = "https://atomicdata.dev/ontology/server/class/endpoint-response"; +pub const TABLE: &str = "https://atomicdata.dev/classes/Table"; // Properties pub const SHORTNAME: &str = "https://atomicdata.dev/properties/shortname"; diff --git a/lib/src/values.rs b/lib/src/values.rs index 0beb32704..b6c75ace9 100644 --- a/lib/src/values.rs +++ b/lib/src/values.rs @@ -363,11 +363,12 @@ impl fmt::Display for Value { Value::Float(float) => write!(f, "{}", float), Value::Markdown(i) => write!(f, "{}", i), Value::ResourceArray(v) => { - let mut s: String = String::new(); - for i in v { - s.push_str(&i.to_string()); - } - write!(f, "{}", s) + let out = v + .iter() + .map(|i| i.to_string()) + .collect::>() + .join(","); + write!(f, "{}", out) } Value::Slug(s) => write!(f, "{}", s), Value::String(s) => write!(f, "{}", s), diff --git a/server/src/handlers/download.rs b/server/src/handlers/download.rs index 272444b90..71d2a2ca3 100644 --- a/server/src/handlers/download.rs +++ b/server/src/handlers/download.rs @@ -28,9 +28,6 @@ pub async fn handle_download( let server_url = &appstate.config.server_url; let store = &appstate.store; - if let Some(quality) = ¶ms.q { - println!("Quality: {}", quality); - } // We replace `/download` with `/` to get the subject of the Resource. let subject = if let Some(pth) = path { let subject = format!("{}/{}", server_url, pth); diff --git a/server/src/handlers/export.rs b/server/src/handlers/export.rs new file mode 100644 index 000000000..aca533609 --- /dev/null +++ b/server/src/handlers/export.rs @@ -0,0 +1,309 @@ +use std::collections::HashMap; + +use crate::{appstate::AppState, errors::AtomicServerResult, helpers::get_client_agent}; +use actix_web::http::header::{ContentDisposition, DispositionParam, DispositionType}; +use actix_web::{web, HttpResponse}; +use atomic_lib::agents::ForAgent; +use atomic_lib::errors::AtomicResult; +use atomic_lib::storelike::Query; +use atomic_lib::values::SubResource; +use atomic_lib::{urls, Db, Resource, Storelike, Value}; +use chrono::{DateTime, NaiveDateTime}; +use serde::Deserialize; + +#[serde_with::serde_as] +#[serde_with::skip_serializing_none] +#[derive(Deserialize, Debug)] +pub struct ExportParams { + pub format: Option, + pub subject: Option, + pub display_refs_as_name: Option, +} + +/// Exports a resource in the specified format. +#[tracing::instrument(skip(appstate, req))] +pub async fn handle_export( + path: Option>, + appstate: web::Data, + params: web::Query, + req: actix_web::HttpRequest, +) -> AtomicServerResult { + let headers = req.headers(); + let store = &appstate.store; + + let Some(subject) = params.subject.clone() else { + return Err("No subject provided".into()); + }; + + let Some(format) = params.format.clone() else { + return Err("No format provided".into()); + }; + + let for_agent = get_client_agent(headers, &appstate, subject.clone())?; + let display_refs_as_name = params.display_refs_as_name.unwrap_or(false); + + match format.as_str() { + "csv" => { + let exporter = CSVExporter { + store, + agent: &for_agent, + display_refs_as_name, + }; + + let (name, csv) = exporter.resource_to_csv(&subject)?; + Ok(HttpResponse::Ok() + .content_type("text/csv") + .insert_header(( + actix_web::http::header::CONTENT_DISPOSITION, + ContentDisposition { + disposition: DispositionType::Attachment, + parameters: vec![DispositionParam::Filename(name)], + }, + )) + .body(csv)) + } + _ => Err(format!("Unsupported format: {}", format).into()), + } +} + +struct CSVExporter<'a> { + store: &'a Db, + agent: &'a ForAgent, + display_refs_as_name: bool, +} + +impl<'a> CSVExporter<'a> { + pub fn resource_to_csv(&self, subject: &str) -> AtomicResult<(String, String)> { + println!("Exporting resource to CSV: {}", subject); + let resource = self + .store + .get_resource_extended(subject, false, self.agent)?; + + let binding = resource.get_classes(self.store)?; + + let classes: Vec<&str> = binding.iter().map(|c| c.subject.as_str()).collect(); + + // Check the classes of the resource to determine how to export it. + if classes.contains(&urls::TABLE) { + let prop_order = self.get_prop_order_from_table(&resource)?; + + let data = self.build_csv_from_children(&resource, Some(prop_order))?; + let Ok(Value::String(name)) = resource.get(urls::NAME) else { + return Err("Resource does not have a name".into()); + }; + + let filename = format!( + "{}.csv", + sanitize_filename::sanitize(name).replace(' ', "-") + ); + Ok((filename, data)) + } else { + Err("Resource does not have any supported classes".into()) + } + } + + fn get_prop_order_from_table(&self, resource: &Resource) -> AtomicResult> { + let class_value = resource.get(urls::CLASSTYPE_PROP)?; + + let propvals = match class_value { + Value::AtomicUrl(subject) => self + .store + .get_resource_extended(subject, false, self.agent)? + .get_propvals() + .clone(), + Value::Resource(resource) => resource.get_propvals().clone(), + Value::NestedResource(nested) => match nested { + SubResource::Resource(resource) => resource.get_propvals().clone(), + SubResource::Subject(subject) => self + .store + .get_resource_extended(subject, false, self.agent)? + .get_propvals() + .clone(), + SubResource::Nested(props) => props.clone(), + }, + _ => return Err("Resource does not have any supported classtype".into()), + }; + + let mut requires = Value::ResourceArray(vec![]); + if let Some(req) = propvals.get(urls::REQUIRES) { + requires = req.clone(); + } + + let mut recommends = Value::ResourceArray(vec![]); + if let Some(rec) = propvals.get(urls::RECOMMENDS) { + recommends = rec.clone(); + } + + match (requires, recommends) { + (Value::ResourceArray(requires), Value::ResourceArray(recommends)) => { + let mut order = vec![]; + for value in requires.iter().chain(recommends.iter()) { + match value { + SubResource::Resource(resource) => { + order.push(resource.get_subject().clone()); + } + SubResource::Subject(subject) => { + order.push(subject.clone()); + } + SubResource::Nested(_) => {} + } + } + + Ok(order) + } + _ => Err("Requires and Recommends must be arrays".into()), + } + } + + fn build_csv_from_children( + &self, + resource: &Resource, + prop_order: Option>, + ) -> AtomicResult { + let query = Query { + property: Some(urls::PARENT.into()), + value: Some(atomic_lib::Value::String(resource.get_subject().clone())), + limit: None, + start_val: None, + end_val: None, + offset: 0, + sort_by: Some(urls::CREATED_AT.into()), + sort_desc: false, + include_external: false, + include_nested: true, + for_agent: self.agent.clone(), + }; + + let results = self.store.query(&query)?; + let mut body_csv = String::new(); + let mut encountered_properties = prop_order.unwrap_or_default(); + + for item in results.resources.iter() { + let mut line_vec: Vec = vec![String::new(); encountered_properties.len()]; + line_vec.insert(0, item.get_subject().to_string()); + + for (prop, value) in item.get_propvals().iter() { + if prop == urls::PARENT || prop == urls::LAST_COMMIT { + continue; + } + + let fixed_value = CSVExporter::escape_csv_value(self.value_to_string(value)); + + if let Some(index) = encountered_properties.iter().position(|p| p == prop) { + line_vec[index + 1] = fixed_value; + } else { + encountered_properties.push(prop.clone()); + line_vec.push(fixed_value); + } + } + + let line = line_vec.join(","); + body_csv.push_str(&format!("\n{}", line)); + } + + let header = self.create_csv_header_from_props(&encountered_properties)?; + let csv = format!("{}{}", header, body_csv); + + Ok(csv) + } + + fn create_csv_header_from_props(&self, props: &[String]) -> AtomicResult { + let mut header = "subject".to_string(); + for prop in props.iter() { + let name: String = + if let Ok(resource) = self.store.get_resource_extended(prop, true, self.agent) { + resource.get(urls::SHORTNAME)?.to_string() + } else { + prop.to_string() + }; + header.push_str(&format!(",{}", name)); + } + + Ok(header) + } + + fn value_to_string(&self, value: &Value) -> String { + match value { + Value::Timestamp(ts) => { + // Convert the timestamp to a NaiveDateTime (no timezone) + let seconds = ts / 1000; + let remaining_nanoseconds = (ts % 1000) * 1_000_000; // Convert remaining milliseconds to nanoseconds + + let Some(naive_datetime) = + NaiveDateTime::from_timestamp_opt(seconds, remaining_nanoseconds as u32) + else { + return ts.to_string(); + }; + + // Convert NaiveDateTime to a DateTime + let datetime_utc: DateTime = + DateTime::::from_utc(naive_datetime, chrono::Utc); + + // Format the DateTime as a string in RFC3339 format (e.g., "2023-03-20T12:34:56Z") + datetime_utc.to_rfc3339() + } + Value::ResourceArray(values) => { + let names: Vec = values + .iter() + .map(|v| match v { + SubResource::Subject(subject) => self.get_name_from_subject(subject), + SubResource::Resource(resource) => self.get_name_from_propvals( + resource.get_propvals(), + resource.get_subject().clone(), + ), + SubResource::Nested(nested) => { + self.get_name_from_propvals(nested, "".to_string()) + } + }) + .collect(); + + names.join(", ") + } + Value::Resource(resource) => { + self.get_name_from_propvals(resource.get_propvals(), resource.get_subject().clone()) + } + Value::AtomicUrl(subject) => self.get_name_from_subject(subject), + _ => value.to_string(), + } + } + + fn get_name_from_subject(&self, subject: &str) -> String { + let Ok(resource) = self.store.get_resource_extended(subject, true, self.agent) else { + return subject.to_string(); + }; + + self.get_name_from_propvals(resource.get_propvals(), resource.get_subject().clone()) + } + + fn get_name_from_propvals(&self, propvals: &HashMap, subject: String) -> String { + if !self.display_refs_as_name { + return subject; + } + + if let Some(value) = propvals.get(urls::DOWNLOAD_URL) { + return value.to_string(); + } + if let Some(value) = propvals.get(urls::NAME) { + return value.to_string(); + } + if let Some(value) = propvals.get(urls::SHORTNAME) { + return value.to_string(); + } + if let Some(value) = propvals.get(urls::FILENAME) { + return value.to_string(); + } + + subject + } + + fn escape_csv_value(value: String) -> String { + let no_quotes = value.replace('"', "\"\""); + let reg = regex::Regex::new(r"\n|,").unwrap(); + + if reg.is_match(&no_quotes) { + format!("\"{}\"", no_quotes) + } else { + no_quotes + } + } +} diff --git a/server/src/handlers/mod.rs b/server/src/handlers/mod.rs index 5bbf7b465..69dcddec5 100644 --- a/server/src/handlers/mod.rs +++ b/server/src/handlers/mod.rs @@ -7,6 +7,7 @@ However, some features reside in atomic-server. pub mod commit; pub mod download; +pub mod export; pub mod get_resource; pub mod post_resource; pub mod search; diff --git a/server/src/routes.rs b/server/src/routes.rs index 2c43b03ea..2ef2f3feb 100644 --- a/server/src/routes.rs +++ b/server/src/routes.rs @@ -20,6 +20,7 @@ include!(concat!(env!("OUT_DIR"), "/generated.rs")); pub fn config_routes(app: &mut actix_web::web::ServiceConfig) { app.service(web::resource("/ws").to(handlers::web_sockets::web_socket_handler)) .service(web::resource("/download/{path:[^{}]+}").to(handlers::download::handle_download)) + .service(web::resource("/export").to(handlers::export::handle_export)) // This `generate` imports the static files from the `app_assets` folder .service( ResourceFiles::new("/", generate()) From ea0fde70d9a28cb9c9e2a38b5c7b7d67370fb234 Mon Sep 17 00:00:00 2001 From: Polle Pas Date: Tue, 13 Aug 2024 14:27:08 +0200 Subject: [PATCH 2/4] Updated github link in app --- browser/data-browser/src/components/SideBar/About.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/data-browser/src/components/SideBar/About.tsx b/browser/data-browser/src/components/SideBar/About.tsx index 9da06936d..bfbe63414 100644 --- a/browser/data-browser/src/components/SideBar/About.tsx +++ b/browser/data-browser/src/components/SideBar/About.tsx @@ -15,7 +15,7 @@ const aboutMenuItems: AboutItem[] = [ { icon: , helper: 'Github; View the source code for this application', - href: 'https://github.com/atomicdata-dev/atomic-data-browser', + href: 'https://github.com/atomicdata-dev/atomic-server', }, { icon: , From 560b6741ebd3ceeb6f1693cc41572dd400155c9a Mon Sep 17 00:00:00 2001 From: Polle Pas Date: Wed, 14 Aug 2024 15:03:19 +0200 Subject: [PATCH 3/4] Fix ontology test and svelte tests --- browser/e2e/tests/ontology.spec.ts | 4 ++-- browser/svelte/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/browser/e2e/tests/ontology.spec.ts b/browser/e2e/tests/ontology.spec.ts index 922b35d14..57f164f30 100644 --- a/browser/e2e/tests/ontology.spec.ts +++ b/browser/e2e/tests/ontology.spec.ts @@ -222,8 +222,8 @@ test.describe('Ontology', async () => { await expect(page.getByText('new arrow-kind')).toBeVisible(); - await expect(page.getByLabel('name')).toBeVisible(); - await page.getByLabel('name').fill(name); + await expect(currentDialog(page).getByLabel('name')).toBeVisible(); + await currentDialog(page).getByLabel('name').fill(name); await currentDialog(page).getByRole('button', { name: 'Save' }).click(); await expect(page.getByRole('heading', { name })).toBeVisible(); diff --git a/browser/svelte/package.json b/browser/svelte/package.json index a53103838..d3f498aa4 100644 --- a/browser/svelte/package.json +++ b/browser/svelte/package.json @@ -16,7 +16,7 @@ "prepublishOnly": "npm run package", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "test": "vitest", + "test": "vitest run", "lint": "prettier --check . && eslint .", "format": "prettier --write ." }, From 1513ac33c8eb3a2fc46a202366b99839dfbcfd33 Mon Sep 17 00:00:00 2001 From: Polle Pas Date: Wed, 21 Aug 2024 13:46:06 +0200 Subject: [PATCH 4/4] Add documentation for tables --- .../components/ResourceContextMenu/index.tsx | 23 +---- .../src/components/SideBar/AppMenu.tsx | 13 ++- .../src/views/TablePage/TablePage.tsx | 75 +++++++++++---- docs/src/SUMMARY.md | 3 +- .../assets/ui-guide/gui-tables-example.avif | Bin 0 -> 76084 bytes .../ui-guide/ui-guide-fresh-install.avif | Bin 0 -> 58957 bytes docs/src/atomicserver/gui.md | 88 +++++++----------- docs/src/atomicserver/gui/tables.md | 31 ++++++ docs/src/atomicserver/installation.md | 5 +- 9 files changed, 137 insertions(+), 101 deletions(-) create mode 100644 docs/src/assets/ui-guide/gui-tables-example.avif create mode 100644 docs/src/assets/ui-guide/ui-guide-fresh-install.avif create mode 100644 docs/src/atomicserver/gui/tables.md diff --git a/browser/data-browser/src/components/ResourceContextMenu/index.tsx b/browser/data-browser/src/components/ResourceContextMenu/index.tsx index 0ee2022c5..2900db053 100644 --- a/browser/data-browser/src/components/ResourceContextMenu/index.tsx +++ b/browser/data-browser/src/components/ResourceContextMenu/index.tsx @@ -1,12 +1,6 @@ import { useCallback, useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; -import { - Client, - core, - dataBrowser, - useCanWrite, - useResource, -} from '@tomic/react'; +import { Client, core, useCanWrite, useResource } from '@tomic/react'; import { editURL, dataURL, @@ -31,7 +25,6 @@ import { FaShare, FaTrash, FaPlus, - FaFileCsv, } from 'react-icons/fa6'; import { useQueryScopeHandler } from '../../hooks/useQueryScope'; import { @@ -44,7 +37,6 @@ import { useCurrentSubject } from '../../helpers/useCurrentSubject'; import { ResourceCodeUsageDialog } from '../../views/CodeUsage/ResourceCodeUsageDialog'; import { useNewRoute } from '../../helpers/useNewRoute'; import { addIf } from '../../helpers/addIf'; -import { TableExportDialog } from '../../views/TablePage/TableExportDialog'; export enum ContextMenuOptions { View = 'view', @@ -90,7 +82,6 @@ function ResourceContextMenu({ const resource = useResource(subject); const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [showCodeUsageDialog, setShowCodeUsageDialog] = useState(false); - const [showExportDialog, setShowExportDialog] = useState(false); const handleAddClick = useNewRoute(subject); const [currentSubject] = useCurrentSubject(); const [canWrite] = useCanWrite(resource); @@ -208,13 +199,6 @@ function ResourceContextMenu({ onClick: () => setShowDeleteDialog(true), }, ), - ...addIf(resource.hasClasses(dataBrowser.classes.table), { - id: ContextMenuOptions.Export, - icon: , - label: 'Export to csv', - helper: 'Export the table as a CSV file', - onClick: () => setShowExportDialog(true), - }), ]; const filteredItems = showOnly @@ -254,11 +238,6 @@ function ResourceContextMenu({ - {currentSubject && ( } - label={agent ? agentResource.title : 'Login'} + label={ + agent + ? agentResource.get(core.properties.name) ?? 'User Settings' + : 'Login' + } helper='See and edit the current Agent / User (u)' path={paths.agentSettings} onClick={onItemClick} diff --git a/browser/data-browser/src/views/TablePage/TablePage.tsx b/browser/data-browser/src/views/TablePage/TablePage.tsx index e717c99a1..672315193 100644 --- a/browser/data-browser/src/views/TablePage/TablePage.tsx +++ b/browser/data-browser/src/views/TablePage/TablePage.tsx @@ -16,9 +16,14 @@ import { createResourceDeletedHistoryItem, useTableHistory, } from './helpers/useTableHistory'; +import { Row as FlexRow, Column } from '../../components/Row'; import { useHandleClearCells } from './helpers/useHandleClearCells'; import { useHandleCopyCommand } from './helpers/useHandleCopyCommand'; import { ExpandedRowDialog } from './ExpandedRowDialog'; +import { IconButton } from '../../components/IconButton/IconButton'; +import { FaCode, FaFileCsv } from 'react-icons/fa6'; +import { ResourceCodeUsageDialog } from '../CodeUsage/ResourceCodeUsageDialog'; +import { TableExportDialog } from './TableExportDialog'; const columnToKey = (column: Property) => column.subject; @@ -26,6 +31,8 @@ export function TablePage({ resource }: ResourcePageProps): JSX.Element { const store = useStore(); const titleId = useId(); + const [showCodeUsageDialog, setShowCodeUsageDialog] = useState(false); + const [showExportDialog, setShowExportDialog] = useState(false); const { tableClass, sorting, setSortBy, collection, invalidateCollection } = useTableData(resource); @@ -114,32 +121,60 @@ export function TablePage({ resource }: ResourcePageProps): JSX.Element { return ( - - - {Row} - + + + + + setShowCodeUsageDialog(true)} + > + + + setShowExportDialog(true)} + > + + + + + + {Row} + + + + ); } diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index d124ce593..f110d2649 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -12,7 +12,8 @@ - [AtomicServer](atomic-server.md) - [When (not) to use it](atomicserver/when-to-use.md) - [Installation](atomicserver/installation.md) - - [Getting started with the GUI](atomicserver/gui.md) + - [Using the GUI](atomicserver/gui.md) + - [Tables](atomicserver/gui/tables.md) - [API](atomicserver/API.md) - [Creating a JSON-AD file](create-json-ad.md) - [FAQ & troubleshooting](atomicserver/faq.md) diff --git a/docs/src/assets/ui-guide/gui-tables-example.avif b/docs/src/assets/ui-guide/gui-tables-example.avif new file mode 100644 index 0000000000000000000000000000000000000000..536bc2e494ecab1154726fe4b90b7aaea6b48c2d GIT binary patch literal 76084 zcmXtfV~`*`)9u){ZQHhO+qQOW+qP}n_UzcUefN29ece?#ozq>xza-rO001B`bMbUA zbh9)A_$U9Nt)&^Gt)-!vtRSP%KkC8O)Wz^W-#?+SFtKs^|0V!{gQc;{|Jnbcjiu55 z4Fl(3>0N&Sf&L5r z7h~wgz$k2QWB$aO#UUg=>OL(v>%{|fVX#kYy}0Pq&A zfX4Z{+!E%jf7L;~g4|RV6B=ytM3PMtra}7BkZ5j4nIk&8slzsGd_O@wGhsDtT%+~4 zF(zFr@L@+qx5I+qUs%cht$?J+ zUWs2_nzWBMjI94Gg{3bnXDP>Ox-($0`TObCyO!nzRZn02$O^(M%5WS%L94FB48rvTQA4Y%QSi`FbHPPqLt)VC%b+vR580IM^^JZZnF=2Jo(@DlL~; zQDjc-;3@!s9un6przm9*zf5!4h%R%l)mFng3|gdxanOGXhJ*K&`vTsWK5OXLDx>9v zn-y$uG&~_`FX(!$&FzCPy#KS{S{%Fqg95Q*!xO$b8nh30LV!q{C`5hVKKVkOQ z=CCg&Qo{19jX;?TZr1hWK=}HcOf~n8{nuXN_u6XaZZMuaKunC&+5>S_)~zpLJv<4N zs{zJn67{2{j(G{AK8blcaG`o)>Th>W2+#Ui#VK~cO?iIS?oHeqKL>ku?I{gPUidww zR{IIt$0y-u@BJPfNl~^$;qR2b>*!`2$NU0<)WPq@jgByR*X%s<+LM z8~qyg>6`!a8UbWq^N|PizD$AKxxdTl@9Nnc^*JSX1?8rDWjSlZ2kKB$ZZ6B8;XXfd z=Ru~atT!u1Cyx(qRbChilRKoo#Ot>`0@ON;ka0k*d2^|~v$xJQ=V$~)3STfoK5UOK zXjH-2?1SxtRRACFXfqoA>y+MdAm2I(+=M$qzgv6zBgglQo#(W4qKXLv+azVBEy@cXdbhMeL{3!ga9M6WsGs25 zCNLu%c53P6R|@eMeJJBw!MRydv*b*;+pC>Iu*to3Sv_srJaI1)jtT5*Q(#M@7bSt- z&D}T4_p)RWFKFqZ$jn@qX{5uYam;aFP_5hfC&Gb;>ZJPP8+z3;u{eHIZYm7I2zqkt z$C+Fz?ys5zL8FH3AQN^Nj_qWQ6;=Fbc~KiOg1dAd0Acw`uC+FJ(4i{P*+`DG&mEM< zzki!fKao{7KVbwz!A;O`2lS99El>Thpt)~0Euo>RJxf?)Tz(FBuETJ2>C-JG%3;It zTssZP9cFyw(!w9c4(p!!x>Q8lT!P|wI^H`F$#D1DRClAlKyO1Z-oHM|oM8^J3S*Mg z4ra_lb>|i*p-PM}6AobWY-L?H+q(Ekq203u935v9>BeiryBqg7pByTnijIFFHAT7j zek*ZXGpKl!Q;B4VVrQjDdMH;7fzvDl_DKxOrI1X*lNjzzWOe*RpX`CYZ zv^`)xh6o7zni%^Lt<9yRPJ?T2IEL9*Y3PW+%D2)p}*E+3Q34pmYSuI$o{SO<}($ zRq3CYBj`+VzMdM=~)h}II*YX2fp zDU%Y;GXxhenPu}m9K=bTC~6yne4G`@)b=6s^dHNAEv4NTgVqFQh368f3^x2(;A2*a-zr4wKQcFKySvJI z+u)@%w+eHcN}1;@=aP!irg(1td!nbUw7$Rky?El|z-pCBgfL`9FqT@Pgwbz2l@K8d z8jP+mfxo#4B@9rrco?(U3Uoz!{wnPmF}z4sSczaAe}N;{cw{n;`GLCahfZeUTL zQ@&~q)Kd!1*F6ASm&5=72xr(x5Pr|3b7{8n`&RLwcu)?(9_v=?V4a|N-@zNp4nTuDS)zIKV)0S-6BIVXRP*)bnU2DG9) z2{X19GagE~0W0czN`1oVc9Z-I{x!n{kez7&G~`oH0h6h86uFdxg|^GWVU9?N zvsM)``^>Even22bKU346*o0&aOF-qSA%v{HGR+SMH{@ucT*W_9b5T?f;R+J|5ri-t zCU2T*>`|SlG^{rZC>V{A%)d{*s3JhuYA(E@nr60#cy7QFD#^$cafNGf;PimsAE^q|eAB990{bVtUYoaeSjR z(SP(^c;QD0k1RZXbb8@J_t>)piy<*^D7I7~swAO}WNBrjjkjw*U$Ax&~;Qa8ryLWnr3eU3Du-h_EA7LG( zRtHvAsB|3fZli`IKVC;jl=fyWG@{?=sW@|oDZ-r(AoN6yr3T6a1=qN%@J}ByKc}X`)0+OQ~B9E_n^N%ZYTqXwmjW!g{ zY+4Hi6NurX)?XXneL^R=oY)KzX;hSf^Ds6I3fmcl-=KNN6tTi-f`z zOw7!3u<_ISgL#rZ9rVowhjZ)ooAjPIZehBiVy7(W5g86;n^Zp`U+7y z=140(`DoKC$mb|GpQ?U82d91wXZ%k|iV%AXL@S;-TJPLUgkm1Dbrn~{2g|qOzx#=5r_TM#* z$OSKQduGEPjki?p`fjp(zD(V&ASW#*Sj6l}dc16(WtonY7`u!;jC^?RsOB%)be7ef z8ud{|wqr`4C33+KP{Rf=p$$;<2YTa;pPW`di^OaXtMrjf;(XXK$pp&Mx9tQ_ncQ3* z(X2IVjsD{fuDIA?|Hmds$arli&q^)>*c}z;>`5to z^O`Vk2i>rjI&=wlA$4_6WY9=f zP+A=VoxBP{ZwL?qoREWVW#s3qHaElQ`WEmn!$ZInDj(1e26v>cbE7q*M0x#y-F+h9 z9}s|Jz9ZLpIfz>)+JE6Tp}CORRrI(_)im^e*|Z~qE-EBTbVt(so!I zQW^vNEWYbumM#HAdL&WD>#=S7JVENt?9gMIJ(!&pFzbeBxFU%BH7*FYKD`u4_(MZA znO|WBt6bXKL3d|j7c2mOgqnR*U}KXnmYb=NLrtLN+?h!Phz`)QKn8{G|5VkwYIjf6 z&V~199uh&-D3;Ul*YEcGbn;8%c%LRk=Kzl% z5GAUEXj@wdP$h*|O@DZ>?lsMs=Y0gtSW5UIM+0 z&+zt^Jc@;z6EicCab@TGCXlFQg(Do8#olgCk!j5v6*3Ne6jbI_12pMexa#b<``n1v z7xmUbewOE4uZ=+ToY)6t1Co_}qzCv|xRzOR{Vx^zP;RC?sZ3ZcBZwV;D|Fi*Pu=|< zoKftWc++%PZB;j;+tJoCurr3OmR-aKe>(^7ytIg5L>rD@2HIfYhzjqZpoP3TqZJ4d zL(tyC8Xeu+6P~%I+S4Y7m%cyxMvFyv=$K{EEtdy6j?)8_sjwBK6DTo1tA0 zB8T1qa-@6v%VZ6GC+Xj>x(J~A-D=L>CCgE5{_cx8R2>-#OL@g3vi)wCyJ2K~`k5Dm z22_2tmCwL%^EKULZ$}ye8#kdh#R2-uZ>a7&mSUp=KaBqP2*i2p#7ls!>aU5}Ki4~? z))o#rE(2oIn2kz^Qj!q&6zm9v>75?ZVZY++mV4P?N1CxSE?B-l+PpZW#r?X}(YA_8 zzdi-ZMX*eNe~#!kVH&?l;a_`Ls<~7{j)2BYZnW)L(RwvW*_g@1D;9Gx%qxmDeeG|% z*3H0wrpT6j8>fA*Le!-Mfla^eF4aQgP3g00$7cfEZCd2W^C1sC097D{fa&Go*b5^GMBf?hbRI2K7iO7cu~rUbg1rjx>@`?<>6Q`-^=o%^QJxJq%>@D zR)WFBUFUAHBVKPF`!L61n|6u|8oLgrg*b=zzcP^c$)flDOu<=>^%IYm@4_;$iEX+W zA11SWVh+9xC0JZg8zx0%aD4yHjy z)szQQ#trz*ySEM__pFCe0$>pj6vBrS^m4wFc-fZ4la=b<1+de#m^^-kK`Fp`wY|>> zd&V4@wV5NSd_yIjmX^Y*@V9H=?D`Y+g_B(gO_cS6BWsT3bxk#3Z#@QiVchi;DdB%i z*GF2CYoG!VWSDNxhEK2mP{ihh9*Rw!F1MZ{52m6M{k3`vEDB9?Z3-*hOAv=4d7S$d3eiqvlnO{97_vw; zx&o>>lU7{x(Ru(o@vlOOX`xQ7mwUvyDerg8>C)(InX}wGaQv;q+3^5z?BXjJhQCnklj*x2qUyIvYr2Ov3!p(2$n8=^!oa9vVJ0(q?Saa-EPia};kbK!8eVo{+P?{VjK2S_xZR$5Q*H0bkO z@+Xo)dAt|-b8?gg7+`vp=K!cUYZR)X*({w^PuO`zn47tMspUHJ32Uqvb;-uWQ;i>8 z7(7tp9Ey((#J^ z6Wz3+7(~PTN{TR*G%MyBUt_EN^uaG=M=XUYuUi!uYd3=+A7-YVMF1-{1tGB7LS`d2 z!B_E6$gY-)1TcEF4Gkjb_qNSC<0Bky?TUC;Y((~9K&m{rwKzRzyAqb2p>!04wjYl+ z>>veFfY3bP0~tvW#7xtb8H@}#6K19;G>e4Ec8#}! zv~=JtKxeC&d+5GgDIp(Bivs$vyoll%(Mh~fkL9QVqTs&2%;%GZ7ZaPLv zx!*5=Q3F6?x1VcI`2cKxqg3LbzGrc<&w&S&UN6jKTUJOSjO6T$sSl^18i$L_XMmh0 zm`5$CFqIi4p+`a>AEbRwH@wV6EL|Bmm}R%i{x%!R93LnK`F_|bzHDq&`CN9Z#x#$v>wc}b;C*{1jU3{1UL1V(!@}`f`qRY%-@|oF&Vm^YY&{j__6wmk{jTKvNnQ7 zi*{R*xnS2_1|=QlkXkf@u@!ndVDAO{DtR_Bn9y3@EMG;s!~t8U<#h0pO2J z#&$k6@mwa8!wk6tkwK~empvgk+;*DB$8K*M1t!_nLznkX3t;Y7`c9kl5JDQ?}_Napf^%2$6i?Ukd6~qxxo20R}xp~V-tbvhwDF= zc@(gKA$IB@Ap12nKzQrlZc!u+byR&o9aRD2NJ42y_*V0y!Jd~f+2$lqBcgXj(xr>jnYm=Zvp%! zDzv9ZM-Aeq?vaef8C{dt659H`s$VF6?-U;8%aBW%(>Uj4_@x_^$s+d?g0#rD3tJXV zZ3(z|FhLv_cspg}wg(#u6lp?u1uatk3#4MY>7OY4m_9_qew|kV;X?8^rL4(7+Fn$^ z{eO1188DJl6JezA0R_5E+4biC)T2*JAg$9W;Fn!?Ep3Wuth+LQDY_L&8E{aCxe1k0 z%HK?{s#zbQ*!Y$aur=>6-UMI8Sj~j<;PrvpW9gi`+>NUpy;uu~@M* zz@%^s{C4g1Ipa&R>*q~694vt!6MJ%$=dCjw6uCD9Axy^Jp)huvp4>w~9zJTkbKo7mc<;F5=&Kw$_kky({oyzx*M{1KEeAsaZD(64)un9-ZuqvvF1 zIFmz{RtV)E6L5SUKMD?v&W?hv0j4`_%e8YxJ*P^V9RNrRolVb4ocR+$8e_BV=)rg7 z#}Uuc{o||KQrcixC@T-k#Ex&YB8D18mhUr>+4EkLpEfCR&`FvTPl^*QaUU&aeZf1X zLu0BKKY!WY*EpX<{OS-T28@Pg}p?>x6dkCFGd4cG{sZ682+}{IVd?!vPsZoK6asU2m zLkr?Ag$v+;O36(LQGm|ep8^n%wrKDu;?D!;6da< zL(O(qEK_tjCjApkgT40jG46uEDkEoh9t3XCI#f4HW%q~X;y~C(rBNjO1@ER|e(kE< zvJqY1O%xUWYD`!yv_LRH2ikQ(JB|eJtjvs&V*v_QzFvZM7+_qT8rfxHjiJZv>dGfk zR7*uReXMVuR-x(uYF;Sk~&ZbXQA?CT=5A zBrSLPpegB^vQOg-_KH6{4#SRlP|NqOLxkTuQYsHmYqgNuC=km)F^y^?GU3a}ALU`& zD4AQ=xkiD|fFJOFT*CMfbCYjqt%!91iC=PxNcNIaSRqRQ(SJ5!Si2boexQb;&NMT| zH!)>!955a+;G#ZU5L~^W$%-W|K@8oh*Ufamr$m z5a`(E-HnT_%Gig1p(axJ;YKkC(fWGUf%6-l91mq@gS=TyBBl%iYVgfoNvh>ou~WXh z62&(UoE|kO5uRk{m8sYPsMdmVsQX)&{~)%l-3r&GsLJ<1%l|u6{G%6T08mm1fxA+&x=%91e%zP){`ty=? z?ei_~=ASKqisQ2sH`_&^ua!n_;ZYO4*VOovATpA%!rKpHGfdRV(7u$l?bmSHJ(030 z9W(3Q-sKvNq`|uA5vWF5LW;5w(YG&bRR@rSjosom*sc^%9VOze_qr#J7!aupTRV7# z##J2K1tlI5dcy0)R@bQK1uiBu&Y6bifHtdwbYMCM2!{a2q5aEmlJ1@-TGa^DI?&b( z6_(9#%G)zI&%Pl6^1+5v)9R;3@}O4E3R-s6v;{&RG`!hTM0~-Yq$kNfW>gS_GjSO3 zNngu> zqWoZL>8u7jM8IzY!va-4p$^1h0jjT6!`krEZNq^uViQGrghdr3=97@>!~5wo6ngQ| zivsTWG$#%lZwH=7ur&bYCBgsx+KTIx_dm>q;lTaBO@RL7A`Mjjop1WU&ve85{fLHTNT*}EYr7n?1kiC6I&ZSxKxvg2HO zb?LAg8HO4e_nbS~!xl1!`vnAsOgWh?j4LFczl3^IZ4%H5p-_#FTd! zFo>DgG*QF1M%p7W_A0-h1dpMny^0`U?d2iK0ot?P*=?2mzOQk_hx7saJyxloe@1Hn z1MbVguwf~#Ly?XMM)<&jnLm{-hz({9eIfqdn%wMt79a!$@xLUI95p7^M+NHLM+_A@ z)9{D`$aDwvbqq>&nPIz=5I2VTf{kxLXdI)vH4?wY0Zy+&p6lT3$ictI(G6qpaq)AE=hy8ce*cGr~ zA|rTEw9aT0=c?9zvbjP!ea%>r@rh;!)E=+aK8&LDY&if*{>yGm+43nQoP~|0;cC;_ zmPRDXE~`jH=i%3sj_LkpeY6v|TWOi4tQw6ik6~Z7d=o6SU*h0shpumgB+8$R0j3j6 zcF&CiSI@CHvsB_pyc`TX_0lxiqR{}SoOt3_Vcx|sN|& zDQKrk0?1c(OvO;}Ld^N%GYrHc@r~5gq+G$NHxJy$W|*56@+N|KtVIdoT*qiL6Z!-j zyBv1=m1fIiWs~oT(hy~=G;wd>ecg=MUrI?^X=8nG zZ0Tm^7tV>(Q&%re?v&7R<4&8eJWJPb6+I|aO(J*>a}Db&=Gi=gXahwFf*@+%At8%% zOz?S^op3N*sYyT@PAvxvfBxurE-_LC!|zxmGAtmYP;7{2bEV_-5%>kEdL8VB)mBuD zq>Ha3cg3T~oFp^Eh$t(S0^ZPyz!7Z?_%U7Z#JKlPzFn+*UG2QLtLY4}w$2lemJk=N z?`Ywf!pNuO*=STE^>OA{uKP6C)oS)v2+D#5a+q^0^Q+Vn#4jIiZV8br6a1aoCVk@k z1zWfi^K%T<>L{GNm{IwN> zB8}i-sZ&s0&*PvA56@Us3KeYWh^7hA=vTkU?Qp?cG`QnxGRsR^`U9ayeFXHj&c&() zAA5H@yLA6W_H^^gL*{|kCOg^$CDRKXebEoL*mjrC@F1aC>Y4gg}b&7N32;l=nArg%dVh;yLv-%*OnN!f!12YfZ8?+(d-zr zNi1>Yx{WIeCBX;DVQi45{R*S9idpJPm#JGr>;av$l$b) zfhQBtsLN&^PaU~%X-^CieO=SakdO8*5iNRb{SG?CGP0P@&swZ6jo{=e>=u;tdnq#3 zHH`&MfNRr#mjL}kT(#d_{Ts(Y9fG+g6?adO-uP>M-F6+6E@GF#cTY##k$USdS$PA-xGmStb9f3%C@w_0xTDAC zY+%i&%}*@Mfq=mwEFT-DaP0}6(X<-|2oC2y`R}H6e`-1t+`{W`9onrf9d$5V^T5Dz zu1d< z!)pnN!tr#02YhJ&2~g~pn90kvo#X~%^{)G5f}o=C{^*j9BwnS?o|dw{G1rEyLUMp# zkS9wot$H+JHyGL_ZYPL z?wFzCk`4w#@!C+)%65<4IQ+rD7zLsASohSw9Tz#Y5lUv}&%_;nV~3l816-KEm|bgH zL#y_&k9ZBfD}{8-)2g2S8nKLB`@yvlNgq`04w$rrv|QI{ncAYZTet-4(JvgS_yus( z_}F%BH?bXqYJ~_nF%x3+RN`W)ryCjBf#dq7(*z_w{)}6R1NzyZ;RxG22FS$S+kEJl z^%rSn;YuZfD>!J1r|3@E9#WD~mN&UA@kFnq0eC(!2f|&hTLE{YDrCgBf1}QERE9l8 z=9FbI(=IwC&)iEp=?(Pe6#Vf$$8Jh7|Ke1OgxkMqn_qTCZgcsA~w>+#(WEHF<+ zNMraWH+-Gy9fu<=pENgzntjsFvPXz|`Y5;yXLFAaJD-D3P!UaGR`w)c|1!>)BlksY zf{t24aZZLWFZeJ1*tg6y8$ z`d8X3d}BN?w{yXm?Rz!C`SLAeT!Z^?+Fa%LlT_3PI7)*m4|Dx z=oJFhE0m4az+Rv=W|>p$0oQ4IPK!cdqCj}ikCxX1rB@A zYKf;w&N)6PlEAsv#uJ3`smZtb{oOS~@UCJdHb6_CGp80uMtk<4MO$ zqP=x>kD!hFNl}bS574jRP6GiTD-J&y$ObymnTWV3pw0Btxog8oLdpxsf1Z?=j)^3p z>o z4A|LiVVYr6B62i6&njjY2x8tcHA4^3Di3XfhDXwt0OYvl!k0}2;gnLreu+m*EAlKb zb52{NHi3BI+*^BqU?pBCR{Xk>f@rDi68p=#VaeG#;&^TC_Q80{l%%$H8J z-O~Uz$I}^HVC1HYd&&bpH_@sS4P=SAc^s9jVPOMr&b6fg9IbOH-k6L_Hu9^@*COAR zn`fc2yM3(Tq+J-Mo@oX)I%= zQk!^z3t&Q!0AI5;;2I_u>p2Tn02sD#-m#wtID77HitW^9C8Ev(xPJ}Hbw zg*YAhH{2ldSW4{E*Nji1K{8xltyM$v zo(J`yTrM`-^kP0VDSK!MDo*i80g*suS4X|+ujwn~t|x2hZY z+Teg!heRKmwkOb|eI(4gb5F6drc41;b>fqchBu`Tb}4v(fGTh)EBEo1NN~}~H^dbI z4qf(6+!NM0a?UHn8?ige-n$}pjG@SOE&n#8;pF>z4j&yQ-?4c}Pe#Z=E;qn=ta#1f z*{a2ov!{Gn+a#BwyI1(l>`hm{1jfGIgYlcYr$V;1(o60ORP@OK>1e2zfoEyNQ!_doquvnVL)j4Z3vSuDjN1xBt^`1LjSwThu< z;-W7^?AU+w81ckIKx{TKp0 z4X97doSStyf=W!|4zd4G_lVLHnw0$^ILq+#2=nHhbnjGt-u>w98~}1qJWm%o?L?+&;K|`0{P* zWOspkN$R4AlBUNYBCy6NSxqS{yj6R&-?FBp;n?mK&G@z|&fo&mU};dtu_Atat4|LL zbX~da9}(x~AVy@o8j%-Mr4%xd!r!=VSS{F?71nq4vEgTG5RCpRwIIT39GN%V7mzTG z<(595$r|R+h1KcH@S&|XB}E-AE4cgpd2>?firqH@Pr8WWu4Se7{o5%89Molm8D^X2 z18)}~3cS(-rbkTDVKU{*LQAhKQ| z1rfoZ6K{2G`{2)6wbnG*8M&#S#_H05C#r>pAzfjiBmBV2K#)?pZb$*7v3`IT^I#|( zZb8OKiRAIEMSa&qraZ~B{gi2&+%i2I{;$ZN+N7+;z95!w3M&UNNtOQAFqyQDKj5wo z_ZS!qxqEKff@>~c@BF@E(Dl9MRxCJV+@%NoWs{4CtoGiY&qpx3bm?m z16D;r+5>ZOEt4uZ_cba|)!C%{y1Tpek@hE@HN${18JZ?BjZPUM2G|hp#}KPg?YQ5s7UtGQ}QZ@?_XBp7ID>;qjDJ)T4O=VC`^uX=&`O^2iB+JCGSilu` zEX{nxfsNw?GP{BhZ0%8b4XqxJf!Hp9nEg!yEEYx$p=>hoZ!{gAZsP0&wkpUL{WuUN zPjfRq2zOvsP?2n!9J&%7_hKsIpU%^vSCTD^h7zYwmVw5x12opfe9~T; z1SSlYxob)9LJI_&WF}y-mpwoy`ydTYN@eZI7^y|&uMl>6A5Ao+f4ONeI6Joea02U2 z_=OL6H6w&3Z{i+mpQ&(=T*Dgjct`uYUbI0+|71=^hADX2zGpcv7aOyug>yDR1qX=Xe-poy;yY;Pk;!rVsgM2+Cx z(>l9`sAHIEdaWT@3&wPgrW9glEIi9HL*9JCHzY*-d%SJ}qTlm)4%Cu`j`UqkMv4o0Y62&dyvgK)mxm!#Fnmt@L1O zsSvp)hOr+vQByo5Y-CWI&pilgubf-w9szv{n;Sie6sK_^U}H13wUWN3MJH+9vxuFy zwnYcDG(PotjYABsAbPkcD~c}C&Nnj+UAA6t6A9tyNZnm_dL9WiwWMp7LVAp|ydWW} z!GL7AMUKWhWm@4?X>!H|el&g}Qms8Nms59(+ zdZtIwYmKvI{mpexiPtP9^lvOt>3Jf}7&QyKf_|%S@Kc0t(gD zM`aJZ08VEj9)%`*Ggk0)$#sgbJ~@gpA~pECtEbdqWeC$`kC*|5)HFmLqQTgw^7dK! zy6~eBf6?3pCMT(%cl%q4_J^thNr>2+Lm{hi4+p3?2xUL$Xqh}pde2XAJ20?4OV3cB zPv)*f#WADwR7XdBx`>;(5<(qnc}*+th6yfhn2Eg0Ic!f2YsY|$)lnqsm|$2b_rZzf zoU7=kTZ?6Wwd6lqlc6-Ua$-G!#J!B$>p)`4n&Ycdy*#HCXQh;S$Wx7$>&^xtU%xa; zcSdC_p!*S4sl>)No6WcB!2+gC*un-t-|2rl&XCZxjzyHOMF%&B9VQs(Ku^2r85{56 z%oeskX_aV_4KNxXK|)1o_iDAfa)Cd&4iP<6OXvo|Qjs~;w_SFs=~C&_#++aE>&Ma< z-56!8qmX_GSZw4SQyG=h0R^maO-uv6iLV3-Q!%d`RfzXQ)7ARYTEQmwWo<0{l_05x zvERdpr;$9$1i0?n)Wk6)If%BN@VEqmserOG&?XL2U%Pza%(2X?@f9;aTZRS;3f?kM z&zz@HK2~T8_!?r9-;O}HoJ+E>$u+a7T$=MSgGPt1s}^X%=lJ_wxniq8c1=sHAH=WB z(%b`cvqz_|1*OIf8=~}JYZ;aM9|u?vP7P9K-CgLM5@st@N6Et5ln3eKe%+ zvhac$i_Mm~4PFwXpR%eF1(m|~r|5xab%2Quh@r-xPv71)m3mvvHKK$xmYFX2(@;Ny z6xtC_1|KSk4m3C8U2V+AtCaRet<_b!~WSIrNq0w>jeNA?EO8v7gY zS@}f5z5Qwe)5B224%%^M4Tqc1GKMblp91t)B?$yE7e(4cS^TO91}F^BmErClv$Y8iM#u;zwCQyX1HbyliY{v@b8exebD-qy_7gKfi*YgV!w? zR04)$e!)8FgGRhMsb$$$y_4d;q-079=YxivVLEOsO?8+b>k?cLdg3Yvz8utdJ`<|4 zd3z0-X*Q)wy#NI%P(pB5y>-K?oyoD=tk}jo>rPp-6Uno91~!411@;X2Wq`ExZ1O1I z2JIr=*C;Yus}$RH8fi>2Ff@q3b*ni1(OFu6MY899gYpXYC7CJ5!lwImeOVsytbO5H zbGxAT+7%+)7Yce!T_8yKlUohu26NmGIywk88@VK@bRsHV>1l}~M6|m_3QRh-Tf+ZL zRFwyJ^bT$#*B*=?sLK_B^b~>)7<*j`R6D|%6_wl#fcq|VB~92hug?29JI4Zu73#Ht z{>d+zTPeoVG{}35TbU%@#K=&Q8m_Wn#?1nP%_n>nPP(-Rk-FC~~n~POP zQ{ARYSj~_lk!n`Tx=IejiH@GY%vLb)2rjCPhH>?;1a$O%5K{WkpLL{^)C|42Tn;J1 zL8tg+Kn;8W2?KwxhgkraH)nvo^37C_*d|obyC_C3?1|$t{uj0e7LvDiqYMa)To-3IGW@0kWhpNayzhN*C{6Vz+d_CRU1It&;04Dv0Xr+(1vjyifB2F;%|hMAw{4}jpt-D(=Rg#NK~jxptz0%KAXXJdYPr z*@RQ_=l>(U)RE$3q3Z&3wS z(kKz~*Ia~P9+n9&cP#&+V) zj^V>QVMg@^Y(L6i3)IljjNxh<*Wk+BA4sJV$xDEN{8w;ZI|A1j!jqOK{A$<_#o>iA zHD#47v)dUL7P<3+iW6so>9NxIj;@G~eB%2A($=Hh#`P zw|*~~GTqxFvgbABZe9yUWC^jFd{ZN#y~x_yuCn3-T8{*cCa9uv<>|bZk`Liqd2VY{_mjG@!c1^A&RqZ)Gcux~ zh=JG*k!nD>a}&YjbVc`&9dVG4dYsZk;vZ;V9rc84ez;;2tR7K>JFq=~*fj^%$7Sxu z+^?)6g8;jzA@c%P4DjcvEoH3CvnX)MKi#!rvSmmKBSRl04#_P$Syus6%gO`hOC>x* z@p39z6E>!+-a=zYh#hiF^qyd(41va|%4fuB0Lu~3V9Ilm)Qa2!9I#s}4*5j8-s03+ zKf%bt7YqB`W5qAz$`S(yf?`P7uJEvXvXy#)TlGbz1SIj4n4IP0lWS-Msyl2FAnDDx zp@@c-FesA2nQM3s*9?^+Cky!`NW<5HsN;l-tE;SE;qp|S7Ar7@qoTUV2Bb8^WESr* z?w`#&m$2<*)}=x2xml1$1C^R;Lx5n5lvYgG=I;f9mxaCtQNPu#9~`1UKORmG^}$=l z1NPz5Sz2BM7R2_07(MzCZ$6PO|Nae#KYMVi9QMN&Xln%C(J+rxhPIvFTrydFXIwRB zjx8ybg+TCK;wS8WW>v#-i+EsbbY137tY&ylL~_s#-`VO{*l;W+>`LYQ40clihW_+9 zcIRF$AH3J`b-oJ)@15yfut;fbbMlm3X3%RQLzyvbE zbyoIOdw&t#SPx@G7lH5Zf+0gH7!>7l1g`cUCwe z95D=*d83})=~IIlcB9dX*Rg5aSi2MvKPKx1IO%x0kX=iGO7{g`cBB`a51zwzmyS@c ziRUm+LKjvX&CD(hcvlSBiwUf3k!rwP~oLbs1=XD zj`Jyk(?xX>Y$eC}Mn=={-L-#B4GyQ}wi!;ZoI@8(7a*7+N(H7Rz1JCw?^8S1ww?X* zBp$NoU?{F_8Lh%)&@ifZ8`@#P6Q<3e0cK3H%y!OSjZf3j5%lAiuy<24yPxFcac6Mmx~jIV6+`;r=%QVvZa3$o!X=JLzc9KhR~&iwBd1}V zh*&8n`s*tOMk*C&JlV*;sMD;Hjr`gn2d^=TQs6`QdXzq)D_4R3eg?=YMTNHGIssbq z(&V>C%ijg)RI7>B)j0yLjc=B#kX}>MR7^Vc9mj?AE6Bfit;3Mh%*_1E+Y);&)#Uh} zs&K8-O=>&$3;xpQv}^FgUFpACin}do02~Sy)h1eUFP+XCVQ4nlm0~5=_(0PdoDTdM zgwQl6lHeyKX#AJVSzir<4CZ3ZX_Zl*U^LeHKEr$*<%6+Q005+D54s6(<@8d+H72Fp znuN0Tf22=@sUAmvdgp2=w8c00#-}V6?D{5kfJ6(hRabm8aZ~OP;CbAGIocJ{8%Gt& zS1WGrmBd<;b=RNK5uly0FP}5ORAtVDJ5Ufu#{q+F5eA&9DkNzeF9Nx6zBVBoP&hZa zA)a~eSVfWv!MIiq@&b1(d=Ptq_+%^czFyYW+@&ml0NxQMB^%0otZVLC_Kv4OS*Y%V zh*9L0ib$Q!tdo-!NJCgEzuHc$NTYKe+g_TaGRCMOnFe}#*uzS3Vu!WfCmWd#s`14DX9s*{|5HS#=LoAI8JO=y6*vXi zsHnqQ*MdZ3;QzOLlhND`mpL&cTP}p8KI&N+;ZLB{hM#c7^gDhwPfn&>E!%f~$Ox=; zvr%mXqco1@d%fmyeEYxDJ2ZLb_@JQ6RvOJTE*dk#_i7hs=*V{N2$mPHH(tCrf7^Co zD*TP31#F1myl^H%OX{i|P!VyQlu9u89i|36!VB^j#ox-2dM@r*RdYgadw0r=?pD+f zRH3HMfz!7;AbNi6_nh9gO-v=dpe|jx17kPNx`W%n$}Ol&>^6!;{N)z%i5}RqOK!5> z{Xk?u#cvl^^x}Q1WCYFB#&{^V+roPBf2%3#<%QvBcTH2%4u0+tL~!(FQgw)uWWa9 zk}1TFrsc=;l*^=psv$t4D6?Q4_}aRt$(2?N)c2sYHW$Q$^W#P1H9jd*KN-Lnw@H*w z7_zoD_t${d)jCs*APXlJ)_%`?`u*qUtskm8XcA0{M89Q!l%gnt_8FSUZqSVxp0T6} zUHFp*E%{#^rT~Nq{T*m^bP>!c@W=eCh*TXT@huZgD|q@Y#t9sNf>CDP%OPHHjF%S} zAx}{@DmvHq%hZx;Uk^1A&rqpL^Hek;2=lHCDG(gU7(v9Y`KxdI9^I0-c;;OG zP4$a(Zf#C(ZQzO8?fZLNp4W$|HigAmI{}`GiU+|tYFg~IY1VAQioXy!y)qAcy?zgd zn*wRrHiojd{ku)nV`D$hYD=rPeD2B~fgX1f)2UPeE#9XEWYRGQD>pt517IV^I|31Y zOsc)Ce_xwKIW%g9DQqMSRo5wR#vHo$DA3BhE`4xbql^GuTI-9yVk=lWrcSAZsVx_` zUM%S4uq;Jv_k^ZM5_y#XD^P~iZtDcB+PMryQdw^4vU`0vgls6M&IQ8__S+;ut4pK5UwG9}JQL|FuBP@$5Q; zz&vKn?76&&-U8z9hq_IQ8M|uL=LQnSX@al@zS~1y_UHHM(eZS%+O`AkpoXCe>Q_d9 zRAS}#Nti zt+rrMn6YD?MI@l~KT(?w7JqzqIc-T~L=(CoJ`j%jZQZ3v)})1WR7{^B5w6kkEV*Cd z?dTglCxW^M-x>^L$!|0w;`80FhZ#lE zWc6~U&Ht2Ye$`E+KeEY^#c&w@Fi25o+mlbZvzjvpfac~6`dYnPWFn+XI28k66MeD6|@14YF8M#;UzrVf3dNGr+jwGP5?zFiAKHPW^m|2fo|U4agYI9XWbDcHRa*h z2Vn^jl6xG&pt5Usc)bf1qyz;e!`{S{>jGBQiIm@G^}J`&@8>A*<$KiXbh@Sd3IBG# z8?{??EH5HkJ6Sx9m#>(PDbj_}U`+!ynKvklVl%x=$HY#rve>4RPU>f|fFWkK#W2lD zC7AV4pTI_*s#=mrtaPc)k-L;T$f^h^Hk57ZCU)CW=gVPuHif^vY}3#wDjSH-kSF-WPSB)Rl2T{GY%!DP!I(m5Uz8gdn~(7h1E~{<_7MXQ2g@S5 zN=^>azq~;|C|~4)H41SqpXwvEJWd46Ui34T09&+lzud``i`E&-OWw}V+!S5g;GlUY z$?^i;i^~)q+SLVA;Mi@Ix%0nqtG;aH3G8)MbK=GFx7Rti=?=7q=JdlACKJ0*Hn4@R zu2Wo)_ZsMuq20CYke#9?Lsg*n9?#PtdZ{-Eh!bA~&+XPvxn%&ze>six-U}xuQY-5( zW7nl=GO%eBc1%S9nAR>sT1j(yFIS!HJdo0=7YRW-zCBL%=Akf?PMKD5;HQsW7y3v+ zf?xcO825PD22=!%kJuN(5DaCx>m+0oq#N~{zC=np{*NfP+F zCg)=sxxy5^lMs-tY2p;rQURBu8xRLV%E@MTml+fHb;_b$NV&RDNLF-Cghw&Zod}Ye zl5&Z#ux`h^dZsr6IIVRD^0dXmQ}o9k1$4bZF8?MBWz_dCrMT8CfuPf_2t6uPv|bVt z@Z^H_FdEZ4(2GNvmakL=xRd`a>6Re{cL3s9rHQXzv}ZCrNPg%K#hoH||K`QGf6w^8 z%jkjvN|9}vUEu#lx6g9@PBz}^+%KiRwfq_`i}a}m(e%sQI!fgQi_Q@dqnigtKrSm= z+@zx+9yGH{4fsShib#aQ)S>DLU4A$4Oem-iRNN_SAt(~L!liMB99YBFW7 z(wuWd?8_(J#`DMG?t~EvT5@_|e{d!ZYmdZ{6x?6PtV0d4I0e7ZswexRA{nE}fEg&7 zF19C;?7|-OiiQunJY=QO6>)CcvoZ*FKdNASP(bGCEZsrTiX@>u&+6~!RT;&+^zGTt zvO;F@UFKEBu=zmTu z8MabGi#JH=u2hK4?gx)C&k3i#^PnDkvx>cFX2)fUz@8531+LFOkh8|B1OYNyc4 z29_2wxe%2co&-C8l?WKKJ#NYISq&Cmu;1iqfS(w8SV+{=XTD)lLo`y>AoZ4c8L$Lh z4y&lO=esUc%(2$ZTYPq85T)qs63V7b5ZnWoRD3zY_LLw$yBUi|b%~p*4~$FF^$vJ+ z77gobIFxyrH-t^%_)6GFmNvf#oDH@6hvi=9@d0l>BvH6jo2R&^e_t~!plVXK8OYg{ z+%TyB)~E?=cF7a*SKlOaiQ;LCG3aP$!FVj}|pd=E*5VZgMOU(c?AtP7}ocjr%m zAMdfiXWZFNp-3?6O32NtCyjW)Y6%HUK!l2|j#I9afD{=*&ZVM}U1-k@;(QBi4Ap9y zEX!NUoX#)i@1qiy!OmH08x%2av%`;w7b49o1es38E)(e>%$eY1a-l34{Z?3P^V;uf zf&ZvMRzTOMIc|rkk1Rb*St+4Ey2AiJ$WnW_J$VUh?}`wNC9JB*-VaG<+GBcJ8RoXm zrGWi871HS(+!uEYP?>qyCmgmdPiG6JbgSYYnS2|6 zT5Xc9;dkXr$mJ-d-&}|AMRccgji=H5sFpZN7~fAh8e2$Olz`8Z-T6o^=?@TZdns~) z1@nk{VZ))N;%D-zFV6QJ^3P#I(Zd5EU<{X|%b%Tt?{$ZC-o8J2UwlhfZn*~mH#P=s zHUf8zQZHMDo~)tpSeU5F-$ybmQV5 z2whfV8?#N`zn=rO9TxB25mk^a(n=1>y__%>#5eC%~h#lNvG+$U7Pyld&OR zHSgiPcuJf2g7tCit+qO&K01to0{5@_dD_I9>1GnswCTGLAvUY~yPvM?JT#bteJ0^& zr5HJ3Ad!m8zz6eU82-2~^NXBBhkc6nG}dKze>j630WRfeDs7{Y2A_dVWW-v}DC*8{ zj6k}+R2$m8Z8g=WK}v`fqtp(kjyRhE-98{VvKdj^KHs4xo3SMcG`6 zg|idUtqikmwgnC%ew(QSoRh`vM?Y9VQS3wgDCW6I>FhK%>Em+axRGt7`Zt+kYyi^F z2@z@fbXy6x8~Z*r2{?3E{sa23`PTQBFl5BDL>-Ff*CC!pnUJyg@4%r*L;etp$sL!9 zt4f|_v*)kaM*&n!$%K4$TF_)X4419JhfyH`T<#9$932LaZHrr70qxSK!QGEqZ!F%+ zT{}2lB#KR-@MiFW{0oE9%IB+KsPX(XZ*IyfS>QP@pdIDqqJ^n|%&1STDO@~)8h4W} ze3+&8Hul|K&#+1o<1VkGahPjB;ZDgZy(SHsh8;>`j~+88Z`*)deqw1<%k)CAGphGs z4>);M5c&K{=5|Y*!cB0T+!BYlw2Fp->N(xN(2kK^< zlG-wl#-r(9*fY=mE35ae%xdPbmU03XzO)LOB8PntkWQ>=2Q5=pp@?esG~Wtj%`7rH z%`F@sZeA+M>bO~%T300mo>;wYa_F?r5&|WPl_y9iarF>6^t$P28{l|H=phi}NmZ18KPDkw1!a-zyJ;1uforp019#=3!!k7x# z#mp5%^#*O<7yZbsA_h*$0^u61A`Tw9vrpi<0CAQ#$)a=RT+E$k_>N8sSs)H{tt+18 z->%F^%-|HQZ#~7Ms35)>PZv|HiEG%ZF%!!wx5ft?>Pjq1<585P=0?Q86&TAlb}M=l z<>gF>p3Og*3wI83OPMmH_MCo_+g*^Po4tBesj3An2sgDT_cXD>9q`t3!n*8`jZia} z(SR~7LL4`WK|-ip1qXJ$z``wsSRfN3T!K%G{2)i|!X z_J87X6gNRH$^Sd@Axc%nqci(k^^MEBPc3=zn(`6`=5bm2>TGRMnm#Wra@kI&(Gd1 z8bjAzqBKUuVa`xC=5Q|rk<2Ks=5^%!*wb@J06&MY9R`SkC5OhfAzO*p$)@}Hj6jYj zqHZ}hs-N}&^?p9Eg_^^=wYeHONN%7@PVEkrw52t@xThVU%9=ZHomN~kA9bpc9&!b5 z(`*OhVg_I^^w~wDK&DxT%9AcwGSkPE@6&tm6nAf=k0#NO6dG&;+V)yjal38R#!i3M zA{OV&4~xk46>6gdH^jT|@Ez!3%-}vI&)tCsEBB{UbUB50E$<3%ubLUmI&nlxN8Y!G zGpq?g zysgSC%>;69cFjkRW11Xww9%8%6z6y6r%~e%D5v`jYo)Q-`xaBoaH0V2M=3m1(7%i9 zj8hgbz?};THhaA0=o_fB-iMvGU>PvpsuEvW9BA`sLLE|77ZbyKo+Vz)hIn4pCt@VQ zx_gG4aE)Qvv>j9zki+?gMa9yus&>pg4Zb5Ira|Eblj)kCIS?IM5WPr^^#5*TY+iP=>3O@bRUtn%#eKRmyxtW_TP{+_^Kpu-Zit(q z_Jv2_`B=jx$aH{PWfl3WCgM6KH)w7@&4DprVZ`qYf%|Giawq3=J|^OC+vZCxBGSAm zLrPWAJkP#JUIhSBJv`wG`x|C@7DG%k*eW?W4r9;8@m=0I3QKWXk}CnZsq1Wo!`lk! zYt_awP@IAmu;_loA-z~b6!s_E1=VUbHas`kwNF=}+895S(|u*Zr*h;06)+K9`;rUmgaik9&lDaFF|5WL-ex( z@%+Xl%qk*btfY38vzFNC3lHr%Cu9v1*qcX@k%A^MmI;hN-2xZEOfC#Dvle*5T;&Sc z`TuFXmzOkmLK`@nAQU0h;SaH=dQVl1tXd&JWx|%kSQ(AF}NdQ&8H$UtOO1+Q~v znz@FNuu)SosK%wi6?_jV>tfF+neL-lYo1}gdKAqVqT|+M%XI0Q5$WfNZ+&oqP50b1 zZrkeUv8dHN)`KspX?~6+C+l7omSz}c2AR6-OX*hF+M00iyEScPz15EkQ zc|famc;0cHvjexUC^fMgh6=r7c=oZH!rCIi62Q!6MJ|azE4-_W*q8c3!j^$9+&`;& z$EMhY{)=jq4Op-1{c)uMyAH%7=Y~`{Ng_IMDA;J0Zh`U^0k;`6!C~FF(Pz-5s%ek@ zmlAkMJDW~^jXW5V#F0J9dneNBm}hmPnFs8eLUHo@OBpmry0L5CW`ck_-_TMWSbITlG;jAKCLeF zrhUIN0A;i+*&i;*mNE(6b^*-4?O!zaK}R=~tex@NzhB;b6cBH20bRwo8LQ@E&`reF zydXU4nuni2sS;VLb|Een{O8GpmKaUTkI9e9r3m1OT-|#hSCg812#~*fC(%`_BUB4x ztwNSlU>B92qqy$wtqsTgvZHK1E)KF~R48aMx}b6R9w`*I=+7hJz8KsbHexRDlkG4X zjSadTsWLdEQ#invxCNBy#<`yXd$kNIdY?zMu~oX# zLGqbmcu$(T^9;5vIg^cj+c+8TwQB3^*uCcHJe>Q2hVUMmO<`tZX2%XSRHk-wCwaA^ zt7)#F;zM&n!cU!AE#vuq8Ci@5x|#qPk~k-$=2L1|SRJ{b2j_+thy%7xgyF-78pMRH zH54=TzCb`obv>B1nfFCzZHbj*0QbV+Ar-6c0+&#yO{6GNG;eF_fb6|)@>PIv zpBrMbsfFbEDpNur&7_Fu5}MENs~_@_xY_;bkQdyKmH<0y==8tIn;KAur}Y6RqfOzB zd_VD#%nou%%8DMl&!&Q^diBDg>wHpZ>G0;FGc3lE@Yex`PsMg108S8CNHGkk=KR0 zUjB^*yAoMP0`UmTQ_)g(PB$d)p*67+*rN5K%iAcP{|d7N zTM}#8Be!@qrj2DRLl_4P+LN*PD*W*BGtNDeQA*;5%&721ZAuNt%8)p7K?KRJWdwZi z;Wx=rB1qRgJhfR^8QRFI(C}8SBmKLH3x3aC^_Ajo1C_-p+!<>25vtHJZy+Ly&d*NH z8haIO)gUwA#qlJe9uCJdy;B&CKFu62V?*S~PW-LjSzt|e;JJ#%=*zCDoBAipfVD)Iwv$T#@p9041l7Zr-`VmSswyZZ;ZV8E2<^y zT|RLu1p*&cX^@Wh%-4Y=;oh-;67_G%f9Cfo z{6p^^#>G}*D(5rN`bx;$^ZsM^=ajdcF@L753qNms9`hZ&_eWpNn9ulypl-BdIcd;_ zbk+g*!N#?gK78Rb3yO=b?tEhMx&aL9Aec1l1P+IH9m;D(LxKyYT{v(5pkS$Wneoo! z$~%s=JObAP-U@MTBLe!8!eFeaz1A92;p9JFCp~I<#x~sJu|I>R`Z8R(1j6;bS1FTXLBvT`E4{%Xk&xD)&JlCRt~A(27{ zB}mh|@oVS7PD@?t4C{H)I}>uYMoRf%bjQg0L!1qYd_hn-a#6&ttLOB-x&=TtF_{Ew z_}!14e(Wt0-ZBQFl!boyOD`N)n_WtGk`Y2lEueF1VwpwvZI2=QjWOHnW!O_&)5oHv z-bNyDrr}uq0QChLEY?GHSJ`7IHvJBYBgqrnN|xDpZI+92%L*8hy-%nSQN-SLBZ0$+ z0p;ANjuKfk;O;zemcm3NH7YbgAeK7B6}_uO!dP<{yJ3iy2#g=7ZHr@>mhGseJ$y0> z{IZBdcJmYXf@>%u1 zGg?^i)vvd@xtM0YHCMh*Xq*=k^l#ZuiUU$cRVl1X+s1%#$9XNULw;unL7@irx&DzxEVtQNU5Zsrsw`_!SAXn0$n8(b{LKB0T zcoz|;0Fa2rwL@9R-Ry{fd;HI%(P5p(K;e&XlDEz!v7Y}eo7{T`NlB5Vw13K-xO;Ti zI1-(|zo(QRTx=RgWs}^&{r52tUxta^+WAbd8-sDkx~LfiIVx7E`Bq&R4`Rzd67E2l zTe30&N1S73WfK{$q1#chbgYpwKQ&cnA)RlM-N9n46K|X-f>yPbsSYLTR6j(WgK;!7 z2r3pCIrq^Ikt2WyS5bXv$2_Vk*nT0AWV-|rfH3IQX|4e`SvW~x;>=Ssb?^V#d?L8!PH;#f-`CZ zN~3dC;D9b^{e~JhNI<-)b6cICj`AnDy{dy z?N-Tb@3IN#nfe{3Kr_S3?T}O2&$(iTQ>>>BK*Hes&`#F$D^e3e$MHtL`j`+23)+9* z3@uzWhK&G=BR)&VpvR@Wt-`~IAcsptgNzbkjy%u>E~%94K`5e4mVsN&1!6J7k!3us zD8Jf5@6E70SqQL|CvpAzx}h$@vW{=UgzdOow6bjghvOjxLMvGz-xB_AUSb^jpWgqp>gi&N5CP&RnfQ+q;HqYfmpr$#zd0p^cCayv9S^#5U5q`JF1KWC$ zbQ7*7@YRZLJ~4!TVlhscqI3Jn|CmD+^{b3wlK8l#^-r>Ew>A~3p;xnFz$4{})V$Y5 zqXS+K(P?ej%@(KBqvKDuKq}r3WMfh(Ip!iSDCj*c@bT5*+{6PK+q@y`@26@R2K4*Y zOxjqk7P-!VQ;({vp*{r_ZJ3W+qf%NdXUkb}1Nl8Fe<8Ani4~sJPn%FiG?U3%4yIE? zJ!)Y=8L~|oamr}}_}H@?f#TLiuiN`&W#z-Jz=3<_v5iPO?V^URsYxzCaZeRFYLEmb zF&P}G#Rbpj=d1T_Vj2C=f5%o@n)-$zX!}7=Fc_=cSNUFCRH+PrBPR^)c znZBlH=rRxuWmaRh;3!_~zsTo>?rhf6W;>O%>REQrt%_Z$Iq1fjFYBy_pWA?InljTu zM4M_dmQc96?Mv#=8@>ItfIzglZY56!_q8U+UblALb9Elfc+%b8J;dX~`iVIEucecc z7mpmk|6G9DDp~RPEA)?%4nOYmnzf-oh)PL;q0+AeP&-h^3U(%rY>RK2f&* z`Xequ^2)I84u58o%A0bQz?|E_H}v1B{M8rLuHY=q8)+>fxqQ6`BFn2@m8?yVl*8I(|5}&)(`m--C%X(0|ilY)|`(a#6TA6z-QwKKZ& z(>G7)8tg(a%wR79S?fHHMHj=0jYh#QPCGgUu^pl;w{}*EI#g|FumAViXtY5TEF~#h z!AQFKCDF!-a5kGqXNk!VdY#tEEt8uaKIeydYLC3ZBZOhouIN&S-utJ#~v_a zw3(2jQ6t^Qd(Tr1>$;BFMaVpY8Cq1_9bpyWdzhyzo>oy09@vSJa72|F(O{-p)1>*v zXHBegX_6~GUeWFiOwknI-G?aE3YX9LXqhg zPJa{NwQU6WwRty)6L@+e&(xF(`z;fq9-?8f!uEW#!QQQ`+&X%59cXj-bplmzs^AiP zTIP3UJ6qWLnq+P%rT6^bryy?iS->gjY>CT;-58e&+^ts%Min!A$kBF-Pbq1r#}s$h z6)Ogxip?s-yJwh;dP=&BjN5LrgR8@JEE461fD|k(Oxzlfm0{zp$AR3LoJmCI1ZC zr!iF%9=e~kk}W1fFu^o{mslImJc73tV;{qij+L@L;mN__0s7=E%tGKo-#rYETRA^2 zrMN)T#C{!Vm71QW0RRlovPiwm0zNgmU8#|aMP>bywNTkdiZlHOtkX$}Th=WCz&}2c zJlwvVB)Yly?A&87r1ex=)v~;w;ZUv*v-i#{xe{-FdAF^fuQTGb0g)zoU(9C=@t?!Z1d4)}p-mW(mt% zrC^ewTTz&5+K&u(#UBw3?l%!U^Q2cN+L&J_HBz*~;eeS+Rh`0<)0PMCfieAk7R{y^ z$Sb#mfnATA#f1Sx7=xkirN}LCdxpaLl7jO^YG6#NzK@MtT6o*Fqq0_Lo8HZIo{D=* zE+_}PS~}{8JM?ph)L;6a-827oq+XM!m!6*_UF(f}C|uCjhXgbvZ%H@Tur$sVYpuKu zS<5(VhuTLMqq$aZpX;GezPD$nsb=$G-xfKTIU2}!=PR^=%jQ$(enLVwZZ1pit&xIP zV$6ZdoI7}pmc#ab(ulSmJ#0$kNrldWuab4kaK-0e14RW;C-3o2DmUwIORL{3l%q5o zw=F*>t@$7p!1jx58ng=+a1DNO10^Pz9G+#h(B&?IaI!lylwbasnE1TBKf_@ks8{ck|Cs(M*9^ zp7VR0qM5)d-i%*en;>}KP&xU}LN-j$d*4&0u~wcZBhF?LypSw zWZY=mDF@7euBu=gYzNW-@YRkiY><2%eqKF}@n?UnbNMGV1u@#bU|Cf z58mbZLIfMKim{1r2I!58mc4!J@pN5=(eMGj;Z+nRLa-Mdr-!rk$>w6am@vH7D5eUw z$g@v#|FbSyz?xoDmcu*d~Hm! zQuGDUScGyx6B`dM!yETQjiX+|DPM%0nQqIE3jotkCY}bV4Pw~r{f48jg1MXBX9=in z^@7?`Lx)*qacP=5-Li6G;m)G*T)N)*+1nKD#jFq=dTI;OR)6aw^ne)=%%u7Eq^S;g z?Uz|K80|{{iH#j6CPWH$K|M&E;{mkdK)Ve`<_V0*D@dS6+Au;zF~?((+k2%sUf2=g zxhGI{Iv#g@tCiMER_*V5($K9rD9DAygxxq#+LsBe#-5=%i8AYhY?EXPkFhH(kofB0 zG(pgUY2(o@8e*DD9 zogs{2X)WKp(LiUjSIuB7e>%cnByz%ZHn_bxd3^~-&Cj>BrDkz$T6ffqChd~#>`pbd zxyv&Z!44&Mq18OtD4A$PR<)MKIZNwyZUa_bX@+VkXT6j?;Qw8R2b3~8!Od)Ay4FaH zpEsyg&+aaKDuDb(7)O|c!E2V)U`uJ!9eSSpf~!C9Ty4le3#8yJwk{b3(29~} zq~Rx)VKHNu^U1M$WV-w;!>Xt{NT}0CtJ6Rg6>qB#T;LRz0xa(a1Su#3Zwz)6$4fT6 z5LkgG+pbV^C^*S3SVs2{FU21XOHZ{pk~1NoeOSDNoB1l$+GOq`7NtQZ7!)p}BtW?| zr@b5yxQO2!yR~@bX~>i+O)Djc4fV(N(phu(UQb!#a|sK1-nrfK#xinpAM#0{{?ID} z`3#A}vsqyc-l~P?jP5IvzDz^~l16^g`9H@g*&`B*H$JQh8e1JBG(Rd|2a(@TtydQ% zi3oy$er#kn$x%|pyt^3;m7$Pw=RNlPdR+z^K6j6x0GSfjNl9~-?qt6lrWU`4XH2$4 zAl$r`-3ie`aFm*8({z(1_b4zL*Nx$J$q<*VC?giVzrPJ6ErNyKW|BPc?S*;c@c+FKQo!=-!!RX7J4y4S?pWfg+Vt0V{9eAS&cD*3-|##JoB3*;B;JJH zH!&YyV}rnqg4&)?+yicLqud?ZAzh0x~?~b=MgJXW1o{U52;+9|E7ih zRp<9MDU6-k2xIw)QE@h9x3rAOY8H7H<|j6-a=>-q4WYn{b+T0+_44vh6@cJJU>TRb z%aC3Wnjq28|h%#Mao_ zJ57r}umogcHd|A&Uap3g8PY7r_&^wiRzZ<2mk>O!)r9o z`+|+qXNtj#sMsd5XMr*L!)sF@kt7@h0tv^KBr)aseE+oaM#G7rz!Cn~+CHYCXC2w< zD0QmE-b~6C{3>1xX&bRvDvEtMhZqAYqvv~LAGO!tyo?mN=auveqJ8Zl4l814jTQWGuMz~D$$X{`fn%EgE} zMtWsI8RR9(&R0CmEFWGSfX(V(`A36ao4bW#-&Vt$Pn=O&brI4)8xV$R6T>NsQCh0H zedZ=|MycKOqmqByL8B_rLjwl@Fzn(;2NC{7CcmDfiZ+S8hDUDSIY~)nus>^IzYXEU zMDMf)WaM9=p*w`LuFFHQ+9WCT`>Tt>{27#j^+f`QFB%V~(cPV1p=g19?E1hx3D^|zgb7TT=ac6VMw+_HS zoPndBwhuBz<`KUOJe0T+~UHbba+wU$3?BMh>tap3@FZ|F)!SI>7` zV!{sSWlFJMEhrJmZ#NSen0_4T;&@_Ds-osV*KjZ{EGKS zx9pkmG^WRe-V{2E@Dyl!$rQ7L?sV8b0NxHd;QBl{;?jxojzha$xV=cM5=P_ZSs|3k z9*Iz7;UyBUY8DJMb@vEosn&I?NgP4>8U$E3HV?m{LZvXx27&<}#_Nw)pZ8&r(&Uj| zQXS_Qv8>;|IzXq0EM@BuEVtJnb;XW|=s~Ax;adZ7hbygj=`xAl(XTgV2U7Pp&T5Vg+YTIcrx?7U3J}EWHlLBV2_@m<#?uwV9=KUG-!_TD2y3X86Tn+ zjZ#5>)%W;T8@ng4lW#^*3AfHDLMvW3Bg~EmG7VzBf@&ZEV*TxYY&J-gVf!Hk4#F2K z7a-SJfp3vOCD<1s3H)l)&~rjTPow&pA47Z5rvM$a{GT8I*f>I4`QUtKr_fQHcj&<9@Jo zU`<0HW6;WOmrM0OHDrn+0__&C%~3^D8|@g60z6au`F?|II{KSQzPNM*e`T?@B}t=Z zBdTSub>eE_#<2&)jQf$iAJV^@I$N4EV7E~lq2+(kH<_Tvq7!L|nzL3PvL%ajKE3Y7eQJTk!zE z(0^j8CP=L%6g#C3c}E2Jn!W%!S;jVH2l&_m^?`tp+@#AIvI&K6L|?q z;W-(TpwHO(&OTiiTJ{`Py?K6m-YgWWXV~|lB((+LfGt&Ta8rLTiK(V-)TCTnBO4FMg#GS?vGwY)`;+SGGNVu3m#b@f?64=3wb}^AsW=Ca7CQE=N$LhJWi0C1_mg6f@}P zu|s=IGhbP$uaYelI+o95Zk>4x!w2SvYBa%LHA+2zz)+3X3=|WlOr5LFY5kHv^zWMt zel4?1lb|E`PULK&`G+TS=U9^m7CW)}zd`E7Qu#|CYF=~^b;O^!A_>&thgc_0LW!ed z#ZApe(Jh0gW8D94)m1l$YB7HU+7F<6O;vvKqBZ5D#kJ431$mid73~2xFwaNZNQsg%9+T9@&m6fP9eAII1?p`BSp)F(IHD^| z6i#`w)+y3iAU*DiczD=NL;bL3I6RqKn7iS#^o2-)^XfKhycXiz~mv2qmbR4u#^BrWBi(&aj6-;6ui8j!biYI0%UOkXFym<8>rwqSL%&QN4r+f6|@FVlCEwg_Fz|v#? zlm2Xo`FtxU+kuqeBUStJ59YOZDvP5H$@GI8OP_LsjN}$=+{`Xn+ICBT`RWdjp^qr? z>(t5AT($2=B50SPr+&87Vfo`kYg!ZUrWm2{^7lnE8A0Eqiy$#qK*pTO*?AWh<;+{*3;G9#1_0FXzG=fh${m=ISnMh-eEPOeVFg*wF(W`+@i{yIPXTIt*Fo%g~29l?(?i?zH1wAKu{kZ=LQdmwA`F7z7YRK zGu-$&hJo_UXQc$2atP&*fh|}t;nF*iDbAiuI#RZb&1jzEp3CLh>lfKvny2eBWGM~#PsUA_48QppyUB>ahy zZA1{CU|Q;yJtY!nad?x!jW-V;KjyyC3U#1DrA)dgalD~T_VpOGOl4!%Ng12#*~n1*itu)%kBgrTO4a7dSi1gTIoc7IYLOi@sjN9X6)<8@ckDc<0OIKQ zf{D9`TX>K~TQjg?7--iu3dyRVLVr^^MZprS<`W>h3=<0jE|Rkz!eV(QKKA&#__zgK zsPuJ3>TiUth)!0R`cHPe`&d&5?ZH|!j5BU|-g%U746&ou+Em(EYyrBbY7^K{f+p8x z={jE3Zo!3ZAXCGbVw0Zs4wR~+yftrgDseHONU3z|ce39SIiYO6cAyRu2Zym-Jz6IO zYjA+*4MgmsQd1qUnZm~Z-VRUCXaTo1&=IARi3WfXLW#0!yvuq=M}(>$#26-JvT{{=!s3~r^d6JioBFHq(x`I3-u+cc2O>JW4Pi7 z67yJ%;LjCw|9f{-ki2^V=kj%i5kU64I`n+|dGHorFiHTLC(e#``HMs#$P!@}Xz#Yr zb4OEvJfTxu6Dd48myDzAO1RFiPV=(ye@L7$dxjv0K>xm06iep`y=l-$Q1Y8%U50!E zVJAq|@ACvbXH7X;0|k!W(V=ShX8N(PoR;c$=uzjbCnG`<#GF~nhBJ;c_yM8!Iv`y5 zaMwh4x%STaS|{YybldHGVe|SD;nL>fwYOl*+C9XbGV8nbri7kQ%gp9Y*lClu_#@~B z7}7T@EWFkxr%#FbM>voL&U636n9Hm#J~0=1P1J}&5$vpLQ~uiB9AZS`Bek9(7Mhf~ z1x8OnYXE&~jrsQmwLwYNy=);(X3L1tyG&lr?Nut}eu@M40 z07XE$znn{O;e~}4fa(uKv7_7|V5^ScZ|>s~eW7f_T+xIkYn%*LkC0-K`$bkydr2i{e&kM^BpI1l|^ERZ!G)9N#aRtMJ}% zUz-5UabwGDG0{1%YZnL5@a}r}EZ`)C)6xg8DMHi}ZY7g*Vu>TCbaCaw;oiXZ&E{44 zQ9zlmIq1T9i=HIw_Kq?sxMxXk*P*(lT?=(w05Pr7`Z6n({dy{W{Dl*YUIUn+u?SM_ z;Re`U7ixy*wPUvI%NO&a%u=df-Blu&a5Dt7w8wGq63(T7HIeyCkvSa>EVq?6#QUWT z!(e$A2mUqqT^=&EiUIwWmoHA_-Le*o* zqkm88d-%(E?j~Ai(mUD~U!?aMHdi|BIy@tRF zS+35Bpcds|o-d|QxUCX$8=$k;JPl4{551Rkt04c&3bRdI32bv7s*xB~kch=j(Aa7i$Up>_*Ihx zZB#2i!A_uiS$#HBouVs!hqq2W{D?lB&J%yKr6X<6GO3XMtoypC zngzKBuX+!)y=G%OUV#8qG@kLnYG8IkOX#47=Hs~jFpX=pq>~WM;X9yr*MDF1%D#tw zxP`X~UzpTt*g?>*%1)i_pZx(A*!!)GPwaqj%kq)86jH>gBo1!?e!c#TJUBp%q@#o{ zGHQH)>`g_+ya_Lk46Yaqi)O?PtPx05%P0GCjOMUMgDa}`TDcI~K=nw8n;Br>@Qsb< zC0Bb_{8TYy@^s*0d}z#fJ0d}cY3bz8JrIPGAM<*ebw9I32y8tAcEbntXd4It1y_D$ zq{RFF3|s>8<*6z^zS6uuB;?Y|D|`mO;HO}xoBJdx9(2a&H(2>*y(xvZ0{V5$#w8$5&bTa$dw|F)->QVz{OZJ6ydSSsvs4<`)V=z9t-cEw<9;wHeGa=+;|$P23#>Wq|Fz zFM+w=+}uC|dngyGG;KQD_@Lw%;c_%5E9^G@A%1MZ^jHO>+-?D~K)mODK<&q#S|Vdn z6RDyYyTCq$pY)~eGfH<{LAQ#fE^YVxRUp>7ZI~fjP!`DhmE&)lIW7N9rlVy+g||v? zjXwGqGKG3d@;y!J?Vf2DP8mZMTRTHv3X+~*i-tm%y4QEtIbhvU?|c;hC@utIG0`J> z)A=rGkhrbeFa&By&bj_`rgKNEa-IrFzUW+wbzU7?M$@Y#}H-sQF$U zRhktn8RS@Oh?4?G4pK%}ERIf&cFU%-6DKMnE`zB04WlzgAeV;pOmoh}1ep;t(4mW( zI;H0ulqc~-a}O$Ds<1U8cw=#=P=lbwz_1+4K02wf{PZOoRm(5CVUu(uMchLGJ&aJw zFGRiEnP+--v*06-nWv?I%qy}`$Jt&8^rzC#IR;Ebb**VNO_I%9#pBy2op34sZ|3%+ zcty47iF#^kLE6?K0XS9Vn;t+hYXYbA`XjJ1PJRo|x)nc~2d+jfF}}np^D|enhi<6| z+Uv|CTk51u@5>)HvYVL{QpX486mAAX_B!9XEwL+dCBAl_y}|u=Yf4My#z4DWQWLe%&6tgz4(nRW`sxYkz5O zqp0h)3RH)Q^mkjIOdP7c?LHpWQ&za_58Z7_v(Gz*ZQ1o=k3z@^j1B`EtT>>fiX&QW zm5_iw_}!$jQS#ekZjr!))c>;CPmYAFk4FXQ`}9!2=TePI=0eGtpma+wid{b5FXYI?U0lR}dMaD%_hw z_7N-=vhu6bNFXtJc(tmisHYp=pWGL^Ts_qLw{&HhF7G*h=Yc10_r#tJdu;gAACjoi zVm3hbde}^#?B|BGcZFiG#Poe|jIrkx{mEURSASreovJ~8lUTQ@&J#LImI=Z15=-9(CIu0hbJB= z3g^C3QbNL^V9!Vs9P2@t_(sl~M|R*R5A6-Ci#u;Lj1qGDPhjC79MTu)Vw88mJW-1# zohkHPFS*S-w;F59ZBApTN{+S|#NDRS%~diiy46W2ns@kJ!Rep3CAL_d`T_2p8qlO9 zkY=-kSpTYG2UFb;$=pE^7)?81&dU)*NJrrQFU)xfJ(=*kGlBD)5Y^a^YfFgjZ zT?@g1e$jPOT7)Y@^6z*yCY0a-vZTrtR##D%)w>8sJ(*WM+K@T7nq~`H|!0^%ZR=Z?M+e;q=*iQ5OuhlWW6rYi5dd=L*_Bz!vaEg~(A zoMdL0qurjf`A--6zXs^BUn%>;ez_C1lGon&%*mBvg}&HgwkS!m36r4AGPN;<^UQh^ zcT{s=(rlU;IP18R!yn!BbMUX0cvY_vXHk2|{?hxON5?scG>sz1(-hU~q381&H|)8D zz2dmz@jOZ51@7W~`5tgsbYZ>D-%+3{%;Twh5#@sl_B1UVb?~l5WG9^-{Mg>;u|=QX zcT#GA1n18iE0VoJm;i*2`?lN1k}9i8O9SVmv@1o!_<5 zjTvk%CzB7G+=i{ppqk#K=fTV*9M8VMT|XSdCy4A@L3M!5BD<%scg^gBfNs8-JiWba zQK%9DL{Oc8R3pv`N?metkeJK2t$AC@lX!w2OrSfVizT{4wa@9K$0@u1(`~>nC=o;q z-Zv?`0+v*4ZLo){uAm7~1U;XR2hF)Coxjm~Z5f9d)ta!%FxjkJqzVJfXa#FUK5`*@ zGlqozLtg}l?kfp-S<&=}NHyA12^Pt!f^{_xO;J~pBY&20QtA$!9qDfJiwjssH;Hzk z-Pgn`@pu8ksC#&?Or_}LeyMW$q%qhaDB~eoHG}cbzmfB8?Q7;z*I-IRfDgiB@$p^F zTO96hOULIBey&`b_(%?#KCdMC-+=dyO6~Q(n9Gh@j}ufUg*BFD>U1i9vP+a`W-T)M zLec!<9^Jp|NtYRr(=u1X|D=Sq5qa*-gyEP$$Svs%^-sgxsIn;9T){>syYb6W!*5ns zAly`>Bh}+rj3|kXPW4^Fayi@o$p>%8S``8)5T6bAX-LA~(g9hmOEN<$;aSmK*GM`@ zF$5J&?_amNX85!9D0{@g8;v|#c;Y-GWGyZ63O77UjF1P!%RGEF*P3}yn5l&b^m=R(^X{KR2Y?|)cB+?9MBK_aqBk=!;8W7^udRY%HfwzmaBvfE6Bh{5rhBL1*g5}z zx5oFJcR0q8F&h=^n&znCXxdr(vN<6p3npryrQJEYIujcO-_2uLZjaSF{4fIn! zWn`Fr#UBYrud9I9J%xLyb|%Lvf|0kz`7N*%U(-JHjr75>MDH;v!YkRZ(Tnq>35%R}fuoW5hSW-8x3 z;AAx=XTGlSjecy&@{e=Y0KP*BB4_3h3SN_n+zL^T!sM4z`p^NLm#Mon{j-gBx&De8 zBtw)!&$Iofz&kN0e)Wjm;~yHwL@HI|`8c{>-lc+fPR7(!?#qE+g?`M>%+@T1Z6hsQ)?F+O#qiOp|Y_h5;$ zEq8+6{dS3j$Ko`gK`n)CeUkG1D4$ts)25W11pjA6&db3OhJ}ZJP#K&}`~#KDn!82P znm&pzW)9dK>OeOd@$0{YxPyZ z^lJ5!;$u%=blh8V9W(`^uRuc~eeG0UWodqK0i(xi<49*X`Zvje*KUu_3Dc%|JG&u0 zk727;Um6{yY!M@ScY>adP(2>@yA5;9S|w+@5y4hG>ogz-_W!$S0=e4Qdf zQKY!cM?OwBzBgw2e7_5plbAW?=HanwZv(sG;lHbg?Daiz;A?Qg9>lk|ac8{4bF7ei zF+jcM7t4!mT|lAk$>GPVb=kI!#AHg{vmW%$Ug5?5;z`xkkQ~nFS$Ef0*m^yjfS3eqMXmn|9 z3wjLvsp+U+6$v)A>aHnGyvv+TwK18pxng!ie0`5Vy5C>vQ7r*!hGaIL-29a6s2a-8 zfx@Pj%B%Y&5Gm;{T6Ep$zO071&>L6Ni6zV;VkNYQ1tc|_JexQ4VNf6B_i@WI2HlhM+lv9MZ^lV+MRTr;PO&FAZwA{=RI^k;L&kaSywI0K?|gO+SFelfJzGO_5BNl0Tvqu|WEPtOA_%&Hw@2I(>Dc~TZr zDL%m;oq`Mh(44KRb=mP0LE_*Qft)E16Q0d0fHXH6HqRVAzTWEf zn65}84aJre3`5-?k((PDrTFY&EP8(9U_1MT(lF5BfS_Q(OV)Ik8l2b#UC=8M>8{OaAiwg{mnNjOSouQ~2_KL=bR@18|4sSBD9y;H@+=+JGba z^j~DKvcsntV>43^X~aPumop@n8L-8q1wu^Zk3)jtc+?;z_lm6Hr#fmpg;sE}g($V8 zfpj`{{%upKVH^ zqQ|&*#x5c~X*1C_?D()-_p{t*Ggfq_IKy{Zsx+;RzkcL5ma^Ozm-_R#-WNk?0PgTa zi}LM)GNnX*ues;PeJm{LdF*r3PvUYj%$Ho6*^<%A4n{_auQt+Ep>UmoB@7{Yvvlb! zDCHD2X`dS{u_Y22stWr3m4-E2vn9GX{slSoqWh2#k_5E=pnAOF&PNL$O8EL27E~5q zqkmz67{>_dRYQXj)yVz9@tK&cwZ6fP?NdWV2kIIKCK1J$bqwAbuG?F#i3}T+I+VPD zOT_2+(>)Gd`KOz6p=(`A4$Wf|Duv%eWKjo)Bh4_+xW3_ZSzAQ}SR4HyzXX$lhvG=6 z%~QVzHQW8U0mj0kD-Rpp(yaD z>~A6Jc@|v&!1*9)TX&{4*@TKmLol~s~=QyuPfZ@&3V%pw7T8r0G*1uo))%Au|v$rWVeT{WcU8kGvDE9k02r;e4I zOUnu!o7IUNwFR+u{DAl~riv;pFTF6W)?iWM>GHk!j?p=w)jGw^7bb)kLmN%Ee6d0} ze0YCaGGw0|u(2DvjcN^z9y;`&Dg-(=&EQQ%Mq$^1r!#k+$iegno5q`;=f5{+ZrQi$ zu=w3Ytk*1gn8pf(0(ud80rir3ylgLG&8~k4U2yw!^K_Xcu)1}`1sWA@Ww3}NMTb$K zgE`uDLAn!0YwTKxRl9ZHrlI{1FgRU}UZvg3qRwh?b#UgGpjGYcu8j`uD3WPg%nnr`=(5+{%UX?m^EM z6EGFM!LJe2r102;w1?}42E}p=ZK+}Lwk4G!@ya(3tbR^TkdLS_B!~n>@Of?2>#ScU z=m~y-!_GbGR+pVIt>Kz_8B7lJ;}<)muGshSSdWvyP*BpCZ$3JS=2J4|rK=i_tsfs7 zx%IWX6>`K!aY%?$z>3BAf?X<$Y-^)lf_^?uEu(=92MLWu_Sx&Xc_rfCSTaihGZ9Qi zdtngsZS3`zgL-eH?PC8##=ZWv9&Xe{?1wRn-4~*Fm#;J+YFE^UDtWNWszXc?*ox2G zK7nMK-wl?D*3#7;YyL1K><#QhE|q+r4H%Invs5uTc=f?f2&IBNTkJgJWL(6$Ae9+Y zeo*5|x)4s9w$YfiEg)|5{r87^ITpnS9=PJJq6CS1u8JT=^*5IoOl^@05YW5|F&`P+ z%%Mwxeu9yAY{E(E9Uj+A0G`;2FclP}!<@x~g>s+`I{_;uCn(?K4gMM^+VP*Bo;#`* z^*&0{*>&u?)-BY|RA1u!BnerTj4$Hsg0EknrlVRM!KxZ(-I{HacMrv z=A1BDowPqvdXsr-JeVQF$%TcgMYlqRw4Ohha=?kZx$3tS7b)&t}yx8IE|G0rT^veDyhC!-yWL7CJQ7~HP7 znYDfV5@IP+?46q{8$v@rF1l;#)PCjUF_Z^zXUp)ESaFx#EO7d|Gl!Fu~@>Xy%o ze1KGo8%NPa2X8T1@ebq@A97kXhw|hTInLv5+Z`wBI74 zee=u0KGD_rLJvjNLKG^=rEoM9WMXo(*g4RikvZ?5j!XLYwl*e86LQwv&c1yGUT&}uus=MIV6 z`icPpfU1$2%H)d4jqk6BJ_)ZopBjQHcDJSgtou{~f7e#Y7VVJo-ls9j6%+nfa$}6% zY=67#r!IpY#qUlhwV~2%(3nT}`46|W5ICe$kKDw(uzK&R6q#Qlwx}?yD{+m(B#+9y z*W9D&nb?toCy1Me@7kx*6ndT^>TKJ441Vg?iTY@jU1;A|Tk1r+v>&pYk#>3Iu;%4I z@YI+ZAhRkL+V%Bt$9b>=Oy!e>#TPKV`@VgTN_lmcBU{(C$;E^8nUPQ`AkP2CoCgfL z+Qa7C_F+*3bNu4SA~x&)B9ge&gmnN>0{Fb$6~`3xQo9(Ya-EVEV7k0@Ii@Eg;wQDJ z0W87I+i%7xI!&wD$npKnSj^|3_T6)SAW@Wd#*o~?5()Kpsa0<4xLyZ{bzXTG266 zNMBJK{eE=wzC85owAPn5XhELOYY%$5@S1phjLwK8Nm6Y+3i24d1(KpjRQf~K7;Rb> ztD$~WDka+&_lZtSUz~$4j*1`kA*2SO_XYMPmpIyFiam*X`s=+@>n#0Lq|_KpHR_#G zF$E&KA!EkIj79qST9fPGa;>xlIRA#rbQv#CxI)|zwB4UMBK^ZIrGY8Kn0I(T&UP&; zy)g}S`yt%An^GLRh#n5Svv>sav6$kFX7}G4BHf*wf*@hD8J9D%1!Fs(HbhL$Im5m; z&wmoYf8V1~lgwjF&Y(Y2!VP{A6gF;xF^Dl5*3b2EPvk#XwP4s`%F-%YC@%awc*&UK$c*>?DH;?O z@}y=5ZwH0Ve`KqY)hplwx`?nKRF{;~7* zGE$Q!2kN2~E!&UDG&6+Qbji$M>J6UIoyY8E;<>~-Ki|OJVh4Vv39Qs3RsB0RZNWTNR{Oc0wp7u#enhEk(n_ zZBU!)Y3XJh&9ZlMRgNJbGN4oNBr;ZKsMlQK!ul$$r4uiAaYVxG@YG3VLC!ifY=7$N zjD~upB3-|bJ5(Iw;F-Mr(TFTBha2>s#FR22i9^nHi4Yca_J2!u5=lxmJ_m8%k&yAP z0*E0}=W?Ck9l~)l3s(1BgC}N%PV%#j@A5|V|NP#2Z!lXE;GFAGrpeap$3~7fFT2<{ z-%@A3@3Altlq+2@a!>7-u3kg++5PL^->Oj3KC{8bNZ-? zngR?`LUDVzaVG5sP*;}Z8-TL_Bmn4MlFoQrLdTogsue?R+VG>drx_`SS9NIte;vKuyYmG^)C zRf)5b6Hs8lD*}l7xpEh~?cjNt3tCs%c_z`IgB@n2mZeoT^Spy}xTl(fKgoDMcjXI- z{f$klWUm#j*LI)UkTb+=A}#QS-=~mldildtxkwk4Y=1=u*o{M|seMRr-uq&oYi_C( zNT_ODZC|--hpKuQCMelYcyg; zJk-p#fS*LuwI8fFLS=)_*-oF}8RH@Lr%28Uun!*g^DSClwiFY79X|F6e8i?ycxoB| zxx$PX*;?}{&^5yppq)g`h-l6NFr+%yYt1H{TIfb~XoDeGsXXnW^C#-41j%h$fyqo; zFWbubWzA8gI}FL1=wRV=@S2XNd~0p(CN2>&wwe3L4BJpt59f*P0_LhW0_+1$F-_f7U7C=cDNfhJhK%Ir4 z4RzV(R6)i`=EB2$=sqYNtco`hLLSD0vtG!JbxlTY?K8{)G(^+(ogkytryY~Bu0Xra z=oA0lpFPWfjbfEC{CmY4jasKqVfSNmL=Y9UGGEC>#U$uHUh3EFtgY`IIlJ~S8(;g# zeBbIrk+ABnmBLjX%${mtj;)TVlD+imW9PWUu>}hY21>#YLeyq7Fhil&$D8u76WGXg8KFD1~|Wj zuwZbN>v7m^Y*O(5^jDm0f^s|kMYPFHdr*n zq*zI_uAD4v!MIsfE@p1B-(U+%(KV8h|f&$e1sjw?(s$)I28_BKLhQMoCA?FsWT=-HS8}stwEoc$oyCx za^X47#Sc9awq2vPf)Q06m?Wv*p0{X-;vxW&PVC$0YM-N>nxHKe^i3q0uBEiBDP*pbtRfX#7U=W4P;Xb zx_1CFA7mdHVe|X^cLpo9{a{O9%^xWG6QiON5G_M1_;BnFM&Y#%n&0HOV%Oy1HC>0H zE?r^`7}$0Z4%kjh6;|F0;bT0PDFNSBiQ>G=W;8WU0TZ_s?2F za-(u|#@D8~yC7gDV0VI12+R9ue|s!Ml5@RxVrq%;8V(*uDj5~&MQqB>(S}tAo6<9h zH)1d3J|}0+xrQqaE|w@<-EF$Zc8Yx`H1LhfrQ50sS87XD7kRH#*DVjUlBt_?vrXGl z9w5`hSMb$L4ynSv1|DijT+EHr9i-LXT5sRI;kb92YT5izaB0}IyVxdshORpgjd@yg zsIV{))gDO|g(-{Mh_cDc=yxz8w!&2GGYTfw(~MnEfrP$`p_^JZ_ob~PSf{sS?(EE;XT5PN3v05m z0HbBO*BZ+{ct_(_q@EVQI)jKbWDLgN2Z?0Ab*FSUs)U>~8&vNBV9m@B3fZzh^KF^r&aK!S*BX9mxg^!^(V&tyBE zZwvjYVHO@>ZPH7W5=uJ3EWH8N*5sevO#%@-U!I8vq86?etF@ox7OD{Rb2rP}Lrgnl zbMu^epSzplf&a4033y|UWSw@y08P%-3K#u%k?r+^YCzEul*v2GI0i{H3$VDBylv6^rZrI^NrM@wk{%ANl@$Z&XrUBIm zMdOLExX=@@QC_hA2I;mvdK#3+j)%ykBz|PMB#zvWd;QMJM(psF{VNh`r?pzi^Xjh*%T5yM5 z*QR+0L1I=bgyfZn|5?3ucdNs|t(o;KVz+=wdCMEL>QKgtkdBQTK7rM^M0o5^mgQ|Z z?iRjgdT-&))aXdnlGHA(bkHB(;F+;F`~CD@UPr8Px0^(Le9{Bb04yVkF$G4k3cNHG2yWtmlO5Lwhgm8q3fuy__8_^2h60ncS4TD%qf+hB_fk^O{-ug-G zNJnllQfTR^^eYygAN;3vwfEKqwb%(}pBKfXk4kz_v|Dt@OR%*Uk!Haeg7YK)Tk$hCx~Alg&eZ%OC$@4?_=j_v z_6I%{iC{_w4`+M6&k)~r=?&%{$_tT*l#c2d%PEG`#EIZ1G}r&<5$-8Fnye41L0F4l z-!u2DbtvHytb?Kvqpj@~O9qg^<-GRx^9lwg-h&8aW6&ek*-InpM^I&L*ybM#3?22k z9%qW17n}mCJ+Ed&+yA)?hfD1+(UQ$1z7FiyYyJ-+JhGOnHE;_acgr-F_+Y^7usvl;RPUBddo^Qd`L5yoZZaFo6A3nBVR03 z32~0PEkW~}BfnE#*+a*g=tt(}* zWUxyZU?h&%KnzU38*P9SN++xD-*>f=&W|mwdjd13nd{2fzr&f%5s{(M7g#XKtp64* zi17SFQEZwuF`qGADfKumK}t|6cP79RdKr7{wxCgz3NMSBRr|ToOknzAzXNwfun{mu zZmRz0ocKAueV5yG%|ZoO5s!O+WX?+^Di4ywswrP}WPdBgN(uh{pVFdG?rVWqTyP(z zSYW&>e^zF_(B-g$+VZ!(%l`;yh496-8q~bF|3uQ)OB%+Ln#&1-gzObqrSYq4Zc;wf zojTcO*u|Dl!Rb0Sa+=|PX~@?x`)ov^BeomGNIxnbU>CFMz zTMUQ2iR%IT+vlqSwwACb4&CXidUkqd)hPUJHEdSV*gVGK#dS6@uA*QK`^H(PSmd_w zh$3!e_PV%6wUlbl!b{4f)~ld;G+3Q#*zzDpX7?UP{wZBvOdOH^3O`xxd{{AZFf((- z727^P?^YFS0$!;X(o>A}Q zY{$r^zYTbHlkoh#sW(Du!>~4b!o)aNygEghfl%&u1^Gu4fMO&`Jrl~wI2=T7$UL~2 zX5<+H6^&Po#iv@=!Ud=~IP!Xk z+wP=p%!5^+OsmF4(5K-8tXCxVVcf?6#le>9o%&!RAWBPM>93VnAEmeO z{T5+FpFPpOa!Pk6U$*KrAfOL}6;vZP#a3sLT)?~8du{P8Z#pVVPRET07~92Xyq zPB?`&>!#PT_IwuIVy-duNZANus&W`yW2rV^w%VOp;&%we?kP4ot9!}P%8Y!y$=lb(~EM?6X zu!(av8H=D6_?c!}YV{o2fVM?v6qcY^thYXLLda8PIQ&@~REo=5tm7Z1Pe;nG@Z?#F znNNJX6J;%=jv4W+BqTY5_ZJP$44QM97pU>dgCEJi8hFL8vIQz{!v5MLhYwON)c>p3 zV6lV0_SQ*(b}RLIya8?g%oW_!mc0HShF(OE4j$%}L<8-A)50b{{(0i}(QX;%GYa!A!X zdKPAiC=t<6^f6>n^fBqUGraUwHVqdo+LwnGrWSSeiW=8}k<{DV(N08WmJtteux~#O zjv1_m1|D)j>|qeP6uYk^Lg2v)(*=syC1B}a{n}035#R39+`szc1cdbswiy|PtLFt_ zhn4C@2aXMxF8WbC8>@sBNOyXNDi%ib4x-3_RpH5C5q$E{g&1i)CbM%c-LvJ zoDZDi6GS7s!^w`{f?BakSxa?w#nwI2JLhc}Rqj6jO%So&ptMKZ)~O_iq-g^DB)a2iBR`RB z7p|olEE0eQN}gcft$pc&Q#hi&9>x=Z-e>yU9=2qW64?H&W(!ui@i~ab8RVJU4z;$z z*&e|>WzReV>CNe5&*UZ7>a`=_!&dZ7Zdn5wsA@_P?86Yey`sdE#2o3D8^B)5)k(bm zJTRDvb(`eTbx;49<#K@_71mYutz8#7T{u9&-g0l9G=URFJ>a;X(yYF8bgGtN?qtqV zx~L67r`^Dh)61QNbP_uBgFwT4&;xC7LOzvxuEtmENRG8_x1oQVu?z5S|%hwlRpev?B>7wFLyE%4;olxFWd!XBzNh0vtJR;RHhl;Gh8_Byj8#2&z$aQ14P2hv9|NeXUKKP z5+VFPt8o`GI7pNbcxN=9tz;{B!#m-w3d)#TTFh~LH#(KxkLA>x7j;RN2a;pv&vBp= z&U8+W9%wW50~9tZ-R=uFaFS5@lU8TgPylP5uysd_Sb?B96wdwBBuN*fKmBBuL<+@h9pPOX{ff|(XDv6;ZX zw8YmB0mix*h-8h$@zuGMHD_UJID7Ha4@|^{Z{qijc^GCu0mrV*ZTKFOm@n_|J-E=Z zZfsFWf%C}XD9oVk#|EL^lr!ET#LU2AVY6DwPJqOvxcA@(-PRg6upgK!>7jhZishtWlLpAl>@4x_A zIokj*(6x`_@-zRTMd;ZfenD2XheeA&HR^x=@IJuHL4&D)=1DZ5!SQank72fI2%*_n zMGp=Nbq!Jw_^|eifKxfQQv>&Z?&j@vo=nE#GWi$UtDdxnugU35!vW$?3(#0OQRPB> zKk`f8jX)DXlHdd!;BxHFpfDI+CFHnz52g|bOwel}0zR5J$x{5gmY)5`roVFc%ei&x zYQppUL6vkqvN=Zjm^#75OPE5P(`Z>sQsV7F$S0UT*~eh(Bt^dOWRGrP83YbY5ur4Z zhlSOxRzZr|w`8MKiifmvT{@yCv4qex@}|UA(KrK#L>b^q>P@EfrDazV z6pG$IyQ{bB0RlIk#QcG>`L0U{_syV}z)d;aDRrTrstVIlY$Y!ou&W%nt~y)*M({tZ zNMjGLBS$Kg_t6B8c_sl5z~{MnUd=D=HbSp0$siiFMP*nm{d~cww}k^G#|;mYY-pUx zDAuF0h#b4uE~eF&wC}h7=zk%9nmO*CcwLdaZS9U1W%b=~Mdu$<-qQk|!ja!;P|jS* zFo_ZlCj%?uMlk5`M#aEMJ#M8X7la)FO6Og2H`UD;i=*S(1wHbZ`bLa~&~y8WXx}X9 z?tk`UHjKWU`+I&6E z1F9|5D?Ec#>KqGY*3%N}6flJ|3S~I-$n2#=^{(UnyP}qG7V7Q-@Q8EpGx3k{Dr2#n zunWyRZ8KnqYde{hM5N1sc;tq8w%7gc|Pz8Dl#P8^`_jA1^Z8<2;;yNQC?kLN>PJcqRTjYLHzP8DrRY(q-W&F8d(x` zno@EC5T+0wch9NM5%8nEi1riE)p$B!#O4sehk@`D$SFPz_0QqL-8>k>KG;w2VKqtGSZ zwanp+#4pFN!gAjtmy#o5<}#zJl&X-|WZSq~jII`d);iOU#nMGsaYFkW&1jcFp;|5U zA`h{p{?<+K;)O6~%s{tUzhrR|w8Az$Gz&_lPE+zBfr*%+S%d`*dkDz=zQ$bWfH#lido? z*UH~2PN;FoLA0TpOdhI{IoQK5So=KRI7Jc0vuR6_o6WDRvz6MjKDEG=2P|bE_FQ+u zXZOc1aMTFp&bGt+uYcH@QLj4?1QBpz2OVxgX^P1HIgirh>BMtrKsT5%qW@&4!vt~h zS4W1AJM3=hH~HS9VqKptTBHb-qk_t`>g61oWn{FF8v77q$eoli$T{nI(+DRH)owAD zvLwGICex_H>9(uL2EKoZo8)0yOvH;rX)$<)TB~G$wxGwn4iV=)*Ifl=i8Fu79o{(T zeL(FrTT#k3Yy~m)d+3OnEpc)c&*_qLD*8Px3#6n`O5k;Pi+u-5W;a?z1cO2;ts((g znDOiGl7Iz~%VbXh@=3O38(&8&>klCpebR$%{ZsclQ5wQY#1WraSbC(12x~RCgucBO zD~P3~lf8ihdculm7~me>Er{rBV&nr_Hug7^BZQnmMx$=DpTJFcG^k@$fPU1*Gej=R z(ZWhP;iPnL&k1dzs!N&L)PXOaYOO(yHwRl#5Iv>f=eRExdT?$qL#{gcO4@_yHLgosgm zbPMap{3M;aYM&L_Pno(Yi<7|JZ~Y?Wn!{w3S~I0oAwBthG;5l7+<%GBd?dcvNtR`F zeg;<`rB><%Z+no5nRDJ!m{)e?h*5UVM5p`9#c!xg%PkE-k^86V20X0}gOb}g*;8JN zK_>pUY0KooEGl^AWAzO8Wr8oe;*sw8tVB{f@ji)HSXWtaY6US{+l@SHSoi!N4eY#RUF?~KdS$Z@$ zNOI0DwA!H#=PjmB8k*0V-;8j;j#*K5$|95aU491QvLt$+9yYp`U9FiZg=3l`qMpC7 zc#S#ul{Hk_`%))Eq_pU(AIhx0&ibS1WIhVSl+5aIAu8$=E4WpuL-hT!9yUP$00bCC zaW51;;=&Y&(*)0m;o3hk6+bA5;{-$n8+fEoE6al51kg_ zf;IIb{xn5_R=#VamW5qq@5oLp7*!|gCT5-zLhQ@<7WpeO-=_SGdA1ig61(<6tFz%A zet!!mb1t{Sx1?+kh!$6?VOuQm;^J!hmCg6B{fiKuFiMh(aBsUHFBbmo+kX zC3C@Cm_bHT{^mf-SVT|IRzB;cpyBO;|7R)-p|_wiEO*U0M}Ji0L*NH7>iZPLsMBDj z#Dm7Ed~H1b@PU@vZko^SIc`G> znMsc7*rJ(Ev#&#xPlZe%S9fIEdrGhY4#`1#w7G`{F1tAp6nbm=srft7#hk?2WQrex zd4EIgGE}&W>c~Z7SB@S_&&y35HB`?l?Vs z{2_P!5FZ|ghN8af;)B+Ad1lbLtW&aJUL4vlelm^2`wZ}5LmxJkem8jyt9;z{19kr1 zBF956TOErC9;r9&wB1YzSTyND>YzQm++S4*e{$a%6*!AdW7+AF~o*;eqlyf-K z0%AeXHTj*)f-UmkVr=7e!D6!gX`oGm#ukrKU%k0j82M1BNx`E{(EgBTwQn+(ZWPXr zYrx~ZiE!APqzV$?8wmu(Pbycz<;N$k3tcK0BeJvVpPtA+1uNAO3r@lId8H`{d!!FcrE< z98uU@X8i!XT)-6m1j;H@REQ z8w=8g2SyY`ud*)_`a8lGbSppPxo}1lBGR_Cwm z4LI)cni*q{Dr>0_mt3brEIf+Dyy5+KXSy2wZtzu9Z%&T#aL6ehfNt9CaTIJpo*QrH z@98C&;gr#SQnD*kpv?0i&1muMjL(Pc=On%LKNjaI@|$+gcedDo+LsGGa6a3B$)XE7 znhTV!m|D~JvgX~Xwm>@^7C}=)6EAw!pm^f`mud^gwJ-F(vp^TfX=@y8hWr z`d1D6<&9qXr>#rn0=@LR{5i4rosr}94CHUt{4k%s@TYX@puFk~XgjW9_B`lI$&^DF zfQhLv81KJ6%!3Az1f%*6n4R_%&)-i7Ex>e|WZQBD6-{g_AJz~f^v0MKMO}|>E`m(3 z?F&2Iiwq=})CS_86XoD?EMzLSIUw`xYv1STUyrnZ{*+;Rc6gTE zC-2v#S=6vaPE$OC=X1H(uq7F1@Lh6vTzczw?v}v=1w}qWF=@Pd1pk3flYx?96?EdJ z!MwN^YfeHD;S?D1*pkWpaYeRN-U3bQoP6orLr#2n*4VDoh<4k3f|-l;{i$cLT9r)Y zd*N7C9xwg57+#4zsYV zdUHigu2Cw~e&wUxgZ{J+Fs3GNYAUCUX?~}k{K#A9PV!RTJaQd@P<0_4CK<|_I>*E? zeCjz*X%JYf+a_+tK>~hVn=HM~+75fvux!sr;mQb+B~lSb^=X86sC=~(x)F_v?PMV% znZpju(QQ(Fc}ELKt%$iS_%m?9!a01(bO+ z?cZp66B!Zy%pO1;)cQkOIDr+C!NB4~<*#7Wv>*v$Xs|?f%e-?Ef5GH$n4PW>26W&Z zzTiHveoCf7_%qV@OKbhRvakEHKdCx6aFlhC0xo=n%gfGWUipTvN`EkdbIz7sZz{U@ zPx%RgSymHv9Q|Ym^oy(?y;uYmhKk(JRzsGM&^S`=zF;UHW$)Bp8^6I zv8x5?OZh-~2E(2BycVUERMBTOlTOO;+is3y zMdG{Rhuf~A_WuVWC*KYt^K45KB^M{$cbgWkxm^`ggh5h0+>hrps2 zJKGqgp$v_7u4&}Qb)0L|oT^ee{v@mb8`S@&)V0C3SePD)v?7SMq$GU`G>xLDhamM; zXgdRrDb>>?I7A1UXJ*gVX8#1n>gR+J?B_q)b)xb2LBbt{G=9bw$W;GP!q~_*_pX!( zu!u3oasr#yT6AP_XHTA6$KD<_AK|m0er*uQOvjgti3g7YcFbd) zK~xLS{5609XxtDan#*J`vK;zsHtH$tLy_Y*3MoUBcS66TAKC%{@rD-mfhkcSOLYV} z`~p<$FrQ`>mD=C2gG3XB=Ku=CA!?3UB^aZ17BLwOS%!akz=~~1qvfy5Fq;xptx}y4 zON3|1DHgMfpOuNZ^9w{&TP<|{KqH)LSHr_v_0hymMNUq*NnsS1Ve@**eQUi?EJZ|* zsB&^tfZeqT_te2vNdG`rypx%7VwwdcBbIxs4#OhFU3)?bnHVFY1gU(REW_C5wYW#A zgjUCmIklryaCMS0^QKs4k?Q-+c=7}S_J23rn^1xzf~w+Yx7;t*R_Jb>7TROsZO(}v%AIYtI9vKS_yda=bp-9rK%Vf|B7~* zy3QtZd;ez`?QR%%mzJ|D^{?&;hfhp-l-&6`rES!l*z1M>W^h)w2bN13M<^BS?So;F ze$Vm5Q-_Q;vlRE@SuJ$8#fj*FK$7r6S??Wn2zXKKn5-56WbZT|x4eFwT0Teibo;-# zl2LhcUblh3v`OgP02`Zt>MvM}2OVU!lJcPx5cMgUvwkYA{KBI-=1r?7w4D^8u=(_!#-O_KD4zoQubuYaEgAH+KHv6Y!Qv_y zr)PsHoS~;~W_9!XJm&ct*Iz3)YcBjXNkHxy<&)W+QwAIUYMWp;% z{6@*_#CAhc+5ePS(dkF3?^Yu9{4&zEX4_}HufWkWMX2S~J>8s{X*>IO(c*`CCDHDZ zHvKvWlc*bVprd-pl;Qt zBN;wrk6#Gc#9C`5z|Yk(yaI+$7U49=(J$G_-usJzOrMQ)lua0DwSS`_0>tGz))FMN zgyp^1{^zPKz9NT=T$|8KTy$+*;LEc3Ie)j?3hL?$tvzsEo#sUcuBGvL#PDv4v4L+J z5snC+u6$)IXKjK&-$PWu$!D-wuAdS_a#WFX$h{OTCJo&Gi zO9_8yZHtKvx}=WSPov6Qn%*QRu2O}ge@(H`3+ab7!TZW{vAd7Ud!a;73lI|6nF!r6 zw*~;gnnBpN4p^boDYMv>V|7Z6SJ3ykir_;$)K5C5P~$*jp0z!a!GiWaaax{xJAy0f z86xwq1!N-M!5PeKWFZh!ct9&AErAn{7kpjJf4v}qh(Rq`at4SSj0FxtsY&WRsByQ2Dl+hvS{_ zPulJRq7wk4vv7EjEe-N-e1~X>r-=-~-R#iSBngy7?#8;;P|eXS0jT=p448^R^>i!Y z1^rayH)#dDU;lXkCBy+J9fK=8zefrmH`0h$)eAgKrJ>uF-!S=@+6KFeWbTA4F;#DA z7|z_>zZ=e@_?G29MW(8l?5M6fY`Wyd7E6EEoBn>x=WNfm5`zc}oX2=n>h!tKhel@j zGU6XyT}K;e%%E&(If}>+8cEvz4bt%P^w+_u;AQUhqIK>&7irlOO9DHc7zR$)vYJ}y z$Fl_=7DL7lOfoKHhyiOFEA$J|8KjEJTP%(iioSn83X0nDbaA_|%vY8s0Srbp?Y#qn zx?#uiZ0DU1jkIr#mm#1=mH2zTHCS9yKmR^vzyJJRxcni?_83HkDgD?nri&c3q?f^; z<(ax9G$E1Fw$_Z%8kx-G{7v=+v;yF@ArfA)L-1s#HZ;z$29tXpjO#zArCA zo2Z2Y=r)n;JO33J)Qm~cS$o-*#z5HhBG(rOEYs0aMSt0q3D=4;ME};;k>|}-&3DSH zX|4`hLrQm0ekNtfn~!xw+bflhrOxmdrKn;DR&T}<=T?RC0CH7Ggv?r9Ke@Jc#S}?? zx=F1u1^svcc|P1v7$eUMUu+c-~H626di>D?4pz4`z8C6#8+1nxx=WQKMsyr8;z}#FW zLr<6ODB6tGus{HU6D^x-q5G&%Hc0r#Kgbx&3tP;xxi6LW!?OXuSLbYqYjCeoXLLbK zN<+St99fvM-ErK+9}?vsHyCapv?=j%nP0(O=(4c39EFGU{RF0YH_#{#?+tuKsCO*) zq?6`PN+#Pq7L|@jwoFv%yql}Oo)0j~y=V*lqu5yHcc`L7oP4Kd>$OX=jMz1Ub9NE2 zIY}x4!iLekCfs$oEBqtOWRGMss{xxo&d3PaD$K|w@{|1`f#bNRnS)mXh`gtR4l9n` z^r!BqgX%elE|~R;4BoU!gI!eRGt4Y=T`^q8OXc*n2@j}0PyCB7qGIj^J3TEERxy`< zMhx(tBpKC0@seZjA*nu=zg?SgTBpoeHy0u3T6ITxOhRo%ybhe+5650U^hFxn1hz3Y zhP>D#dWr_?8J1fy18FMViEpuuzY*G0^}ygMxP9V#>D@^oXs-82nqS#d3>7X7(kCGp zvM4gAebRmOy|;AGASV_qfr;_lU%6R8ds^z&$__>MU~Aq;a&7lU+t--(u%w664>^go zDNWJSkj+!BSoo700m74C$CO3T;w|u_c5EaLZ+yN}NLh0FK1n%e=kc8HOt~}h0-?(i z_Z-o+g{jN23dy9yR0Et>R~ZL|kzj5#NPS_fl}QUqlBJsd_Di5Vt^W%oy2%sR5qr<| z?fk%Eo4GyBXp%9{N8|GcC@70?psv%36RILtqKabi;GD9^LqX~N#_9q(@+DI8bx)E>r`ZACe)24yd#$YSG#>I@v6fY@{<4?8n>@X zU*0|FJ|!7cd!F?nEtSao#GsH6w6X<+=+y8j%(%Xl2O$$gXGQKbR`tyMyrGn{aqm!$Rdxcae zg2ZUjL>{|_Z;AL#Xo)0B33bW&G2c>s;TMS> zr~UJ@s1;QoQqtD7rvR(@lcMZwckOE_b+*vUdqr{Ht|rJHXv?ejN-OBFLKk-m+2uR8 zG-)F8Op^lPb-d{dIrr_e0Ld5h{Eje;lzunMkw+(E^y_`GSxPI^oN5_^9Mhjsn$~u4 zH)tq9M_8r63d&;Q$6uIVax(9QN;8Ui5_llA1I|za1b5aC|Ff!LO^uzv&X|DsA5(yd znPp(xq+8*n#kFUX>j3@cnoGKXeQq*81%mD9xlzg9|*PtOx|&t9PQI#T2>@CH2-s zVvEK>=%)vD00a7NkCY26Gw`@1z(Pa39<+(=EgBgC20AB>d7--m`Dq@ADmK5FHe~=} z_qd0g5yl%K!3%5qlJw2`#B?zv*9=D}H=3z^UFd9XWr-P_+h^MoB7=P~ht<*J2PhY) z9Dk>LZDA+-@I}Yrvx3au! zlg;z=0U(Qev0mQBM_HK3{dgeq7GBu&h-)h|84x5@8=)fMfnj&nof}s5%ZTv|9skf< zW?=)pnOnpsm;4Yu2Y$l$9E*$>h@^()050yChkepNdOpY}+CMH*im{RY)(d*_OpM@q z4JGBrcl{mj9VY}|^oe(dD_`<))&&XKI#a;)g1V<+btn{he&~?cY2-qo$|dNWDqyLL zg4;T?Fwb{M4A>Ny40+h^kB5uaRl}t21{a-jl53Mu_apGJjcr=4@0DEqk!-*+gjN&_ zjMZNwbrD_7g>b=r`N7e9Z0~d~z+x{X*OCD-mB8#V*i!nbRA49NPsOuI*laQQI00F> zL+H-1EQNH{y#$A!b&tTLkZlG;uHv^TW^{f4iT2Pv*T=>@VK&3{HEeOawoOfp`1F(R zreM8@Y3e<-sv(&+%T1U{tF-Jt{vx&j?^MH9%TB}X|AxMNnVO(9h#h6yaVgS*H1M38 zamBkqQ$Rqp>5Y2s)iHTgX?&>=DXAXix=;}Z&hDHfok+Kfq+#x08fSjmfxugK-yFuE zRD><0Y%JKL5AwyX3s4wDabdFL-^@iShu*Dt=ZG}Ya$akffB+VNPaqp^igPUk8Lbe| z_Vsw@u43PB7KZTB1pxiMqq2YQ;E9htY#3DlO=!VgX1YCI(sW6X;Cq-|$elEqa zAa1iUCOIXnb@BjoS3K^!SpK78Gr?{i05vr6lRqOvdg2G8< zfETV*?6#d}HkR(y@Y>-ok1#dzC7|4oVnqfEQTIo=M|!7xY@&s~$7@SwcowSYR4cul zK(z;wDgk_#!-1>}giTXfp0Q8&EQSpA9n^T+)>;OQl1qYE>aDMKBLX%-&Zk=xZl21ICvWsFp*cRa?e(+Tp&9?o;EO}K3PTye5`Y@ z%}^*5J@#^_5BM_+rEvtC2DAoiax63cva-`fqH0v1N1Mlp{9xq6nw7@JBw(!UAbMC- zF+MY$!9q9g<~OpN+ET`E$x^M1zf+mK{BBJ_-C*g#^Lp6r&&fpX@K^SXb7ImgPPv3@ zQKq$uJgU*NteZ(Z2PL#$>~$arI1FuIVn8VJ8`q5gD?R7+HYx)CHs-~WC$kC_`PV=> zwcxua{c2{Y`7*T5A!WgH+9$^|F_Xb4un6YsYyyWBaI!Yb6{$pp`RvNwcQwC!*%x4) zrOzt_KO?Ed$`sO~m0+B!vhAh$qmMy{U%^7|FK6x#Ck>2?wr>#z6Ri zuKxpz{>=E;YNGMBK!|(^d2$d+ys130rWtbT6HZibSG>F;(uat+DyvMafh51T? zbG2zshEwE8o1RjQruVFf;Kt%n;C*bM+qi~S)(6k{Zm%P9a7_Eu|4a1{3?4 zBC!O}=}LD=^xLykMcqEt8lMfDNK)+OEceqVtl|~6mkHaUghr=ddph7v_z1t&TE-yx zP=CUrxX$a(yjlm@_(|^melj@%ht`KPLEp55v*N#4{L-GJQ>k3`57Qu`>Yy{b562~b zzvh_k85Elf_82IIK2iU{e7@y{pb$4T6QsmSg)NH-{^5C*w^2b9kq5zZmS;tNQ5lDp zXJuWVeYtd1FK;OAyH@+9YJIgt^9nb$P+&YR2F6RzhwGJJbdgZweQ+A~=wD>oKBCN9!S26dS#N?+LT7%fG(&wnJxR_O`T7G}nG zm>kB9*#Ho3(@szZxd@OAdE3H&ZolCBm7rOy~UAP=GfJ&&4*TKhWXZsq-w9 zP7ppLpV=wf>~=2w%y9AZM!}g@L`+)|bK}uQTDm8SClM%Z8mNQ>8jKajwL1WesXt80 zmZjAP+RR8U>+|)De4=9!5}4j0O4HB+KokXt`eOc{mG6op9)GX-!rzck<5DM6U5cr! zJXZ>Jk&nLF=9(ts3blzy%@SI`u=vKWSBam7>+s4p*3!|Eisg*Kj&oWX+D5$S6C`gq z=YHk~Iy20;pB{`XWcE5FpNUDU%G#AHf!xz|6_+2DB*1O-AVTZ-WAW0_-PuvMu=Rxq za~G$ae9aGAzvj$*Z!`-`qyiG@x9KZgdk2xmO7GyEM|lExBNCkd15;rCm=#{JP8|qO zo!!y14cR@yoc9s(*v%z>2kDE5;ORj)gAZJ~uF_Y2M=^VPR+_#UOZ>P2WIX7V&ofLr zMwnOW$JXpMFoj|?aW=WA7~SeRnHM-kWhSWqxq4IU-{g09?uT#iL35fanWrIxLTaSL z2*T=H;vkhvlfGV)QS@65njo2;@NhKJ;{b2;y`&ODRU0?hxlZFL-61QP=PnA-SvZ?m zj8@MO_oSc))uhaVBBWwoX;DdGZ4WT)4EXL<-9w-Ry7$SWTw! zM05jncEE6a!(OwShgQZPY3H7pOj~Q274xMzF+Y z5j1e{+@v~11yxiSv$#o_{o<+|DiadwT@p^N!6Prwl7d<}`MvN+>)LEMp;OTRmbQ;T zT^{1bOYyJQ0nvlaf>XE=2ixsU^#$Tr@%A;TLKagvDg$H<&yq&(f%w1-uCe}oP6X=M z!0}?o>=A?Vuo*HK{Q$K)f}XZ$X+jJ%3f7A7u+ zA8s7H!DvPb*Ba@z@lA+`-1H&&U-hE+&;YMuX@gLHxK#TVeq*aK`Wgz?zHZCsftj3A zkN_~nr+Z|U8Y!9^8$MU`L<21Nx9-}%|MERvOW{D^e=}?VVQWNk5^)xu=zysnh%{P* zx%kM$rEYd>RxlDLi54U~v9Bdv=ZRKp_a8vXggTy)3@k9{x7kg|Fyc74eu1R$=l@7o z992K{a%qM&spbK#)#Gn0-~Mr0#6Jz$-QE!LDI%qmLCq!iw|9`MY3(VhPW9AmJ27Zu zlEs)xmEww@vMq#})9)G;V5=}EuRUe3xd5g7vvX3XM3XDzD1O}hEnR?GT&;hu?)J%V z>WUl{brH*{%3E%X@^VTLw(=7H>II+W*qB+vxS953Z8T+3N7#+E`4m&H^Bc^TK!HZ3 z^;Y353mD^*^2)qG{O<=}v54+6{goRlF$^6{0Q2taS2BJkY@w-ga%n@xs4%+<;6`Lp zgs7D8NbP6zc&`IV2SS^?lr6^RMDuMLXc^G|eXcj)H13c?h)OE z^)fT5bVcq-ZoXdta$>X-+94yK-}+lT2U+NMWP4ssW1H{5iay9Rs%xK^?qi#UZ&cqi z?y2|+WBxDYDK?4W*tI*Bj@ev3pK*;p!8fxD`)2(7tP7M@yQxfH;9wX0J=)UyfH7I z&;Mu8iYjl{6}`)7P>}`dd$P7??4Df|w&44%sVfv=!U6lKE}MXO_sSg&@DBd} zkaC$U$dr89;au6f3GE|81C*J=V5#QfLkv%$jZadnZp@D7ywlJm5xBp+EQY?pb5 z7#SU-MEgDU{ozUUipBs;5G)g4eb9+NQLITCjd&cj@5sya5+bc*~8PsckW;lqKM(9#-&mnK4cAbEU zB(oLm6)5Qpu^M4r!1>LX6FW!wDC-IfZRIDU z{&TW$5C9L0yus_NuQp~1s6K$MWL+fTG-B*#W*KT=X0ozTC9hYotkMzE8NfJi|I*~R z7CU*A_MT939weO_AKC~WZbEksmeN{#ElI9sRXkgqB}g}tAsWObJ11Ap2HHe#VAYI; zlt5&KghRgw0kA>kbVEo9fi~f=f3=SJM?@r+zpsxmG4R~v0+wXjuV;01+6(q<89qKM zKYQ7NWq|GoJ0L7whKrZAjEWdk9K|>K;M(fNoCV^_N>rwK{vyoca1N%*zzf4{Y2};t zhY#s1Kei4|GZPFKelu1e-%~y%z3RWK^rpH$D|`XCiN^*6zojADb#YUD#ye5fSd>u< zR(f(Ocl^o8Od_!E?H;!q;+vV^q4#BC#y(#9`e0AMK`s(_R!dN9k)T5d!mEBaUZ}2H z58ZkwM=ogv%0AV$Q12n&^YLr$?6!wqi__LKGXAe#ASRqa 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 Vh7*s-D`nTBgDR_kI*TZ%K=|aB&M5!@ literal 0 HcmV?d00001 diff --git a/docs/src/assets/ui-guide/ui-guide-fresh-install.avif b/docs/src/assets/ui-guide/ui-guide-fresh-install.avif new file mode 100644 index 0000000000000000000000000000000000000000..768a64eb58b2d811fb90a24675b05fcd7d0d6f25 GIT binary patch literal 58957 zcmXteV~`-s&hFT@ZQHhO+qP}n*s*8Fwr$(CJ$K)8>r1LS$&*wkKf99v000n}xp+Dl zx>=e5{GuL{&Eqwf?(k`VO8Ds{ir@g=XLon3TL$lM>U51?L`;9cdu zbr4_dC^R2%dvY9u0J2_&&2!@Arj}*1lfa=nE%L(*Vq~r@S^%YPE_)b@_Tb1Rlagdm z`6rl75PC~OZlD~kAa<6kyoicOgw|s{uIZ(prMx~HbL8WS>INVQK`uEsOPM6VbAJiC z4AEM0Am?v-U6}eC9q@RYfbERc@cQSQir5#~m)rnTsHHi1%mXd$9l4ol8DYl7pD><1n&hQ6q`6R>(iG=u2oc>0L6zq}*JxkHbv4AvXGaFE9kk-xE#Q5{;aX!vgvH z4>X%Vi-X8uB?1GRW)1~k8nAfHn~4D9pM+75o?ZWLcakk&e`wa+>H+}2#5 z6Vg(Udp#`%2x$5Dg6wW#>~)#=|4J5r#-(zaGt=#BhY$+WM4+2b_w z!wqxUFFUO!O+Hm6Ig~2s&1HrG`#6V&Etd~3o^Vz|?9;n((zJVah$Jgv4};)#s1g2c z7r>{;(?j7L^=%_JpVgg{5(M00QC$FRm?&)31j|yy|u^pxn&EF=KrZ-b^JlO;$&!|u65r{swJW^j@sYo*u)uDVz_i> zRfCTscL2B;(-xpWN^zOfdu+m@tn?|XlEc0mqTcv`e8otajDTrI_*p~NG<~#mGAUB< zgadbQR&GHb1GRk6ln5EO&%CL+%MTE6VjD#RBOSkeYq3(R!fs{Z$#<=EEj+ zVfT8k_7zp~sWnk&39Og9`&5?j0wb5mQyOZ7VQNhTR;9Gv4`g<6+M=g;xv&5?DD$Is zSB+vk3E(n>v8>-KclJ)B0m|K@85tn*&ApmlnFy}6r=Ctg2baG4z(uARkvfN zddh@HEdwjsIF3Zo8Hd#+3SeSv?bkXMbtrC=>aOnB7`BFqO(GoM{Q! zoZ+$WGYEv?%4>|#0mSkM1H|}lMr#<&Xo4pi%4$m%^ls9uE}`2QR3{Or_NhA- zS1?NW;ZY;ry#Pb7C)NCOs0K#L)Gd+UP)LT1%Yk3@8 z*4`#4YI%vrLB@YLfYG1?Lr!n91LoA#_xU*l?o;lT54Tp!Hl$hOW2ZN6BigSllaKXI ze~cLITRZ@hnk*|VeTYwoAdQ)s@SbTH+1;GPM}&MeNH%H821Fuj83l@(w77%a6z{r~ zeKC%^#h!(PNyuWtfsts`o z9O8*S)NmF$A1TM?uvBZ~0gF#)grsCd6wNna!Y5q}(4#>?v-Y|E!Ht&CZ@^bz`0k3a z!yjpR<{JME@g}RZ^3y>Q%5~5Mwxdc9cMMblpomL;PvMlklzbIo2rYhvqY}L)blIYk zhy{T8=4#XmVlSC3|KSSwz%{7DI)&}HF}*Yd6U%T^meDr6NSD8FwHrLQK~dV7PR9@) zIG^D@3^97nrQq-#%BU!?8R3}-#v4J49J|lfVVLjujQ4FsJs8Ibcff{hN7a6arDv#V;@byzR7xAati1@r_dU9>}Z zf>G5JYVr5)gmuzzLj)EGT-d|qi3h!4FI`+lMZ)cwAf4MvLF!rk<8^rTHF&hDlg4w` z-wEv1uK{aT8`5~J60Gzn5;!>*Ty{r6q?tUW)TGaz=pLk3VSI?{fCODc=Pom)M}#kP?SEo%KOxjb?Vs*ASZN$pMuKOyMNh6S%VpBbmX4cY+1a!U<=E$lg&a!S6TYMM@$m zf3)a=qUKOtZ590PV6S;a24Q2Kuz#NqCJ#@eI?m2`JVe-wL{p7c)3SqRKkkip_3rn% zmEz0Uc&B#9?!?fx8C1g6lMTfkw%mm14I!a5snvXyM|rG7XyI1@b6NoYomBH6i@tL1 zXuWz{o40Dd1zXe>eJN|l@Qcge$`bR3*QcUE2GY><2+=F}vzz%OSxqw8QZ*PTRm-`LCg-Lfoh@J>U1AVe$zJGtWqwZwqGw zLAx;sB_VwdK(~N17+6=QAv^zXp8$SGXFLw>5~NF%++Gxc$=V^gYkqrS1*#a)XiIdz z%$j&%FChqzn}K9|jOn1z$XD4GE95RonuoIR4SKiTR@-Q^?G(U;*U#;3EXi9@smpV8 z0cFOD@`r8nnuiPNDm`~Ar(vWDfDRK( z0T|{TBt4d&w=9-m_08zzI1v=<(@+Uiy|mT<{n4hBzr2T>Cv_2vQ|dTU7oA;{j-0uM z7hM_OlIQZ0eq&!sa8~r3Y+zrwYY-lU9lrI9IA{m?aR_=OdKTAS9V|=KX1+rW#>NI! zqc(E{0w?r-`#!llFCP(x{HJXRzdAStYG}QOyUj)+A{b4|ITRRy>TH}jD)*VcMJ$6z&5V zd^cc){G}0|g?W#+yIy!ExkUjlxltHmm|Cb0Oh2fdtu}{heQ>V1r@vCQF^e{$U@7vM z0fikWHS_SJ4dr!c=vccxXaZGXqzacPbn{G^Vn<^eOb{R#G%8$Z6|4ES8iy6blb%?4 zGxUl>`Wwgy5MF)ZA1DqpWtWk{1J$AuTLmAMs{~e;y>k+p)f4etx9g&al)5Qt2ATb_A7;b){aGhRKnBq+$Ap>@s?#N4$dX+{URj3t#{<^%$wM%VVUCQ1(8k{;e$$w(%~!D1+OX0=nZ&Ci z!I6dbmQ_ti_g8dJnP27BBq6>!KjH0KvH^zK@$y{V-!VQdd{yw%9Y0r06ByUcXumXZ z(s*^%o+jeubfOVM3`Pu>U^J_?|;b!9K*H-@jrO zu}v5u$BpS+Aq}=XUGE^u{Vcp4TCH7FiK?2=LeL{WiE2~{O~}0)18ysV2;Wv>^T~6NI9MEwxl!ck z&saAF`e*5-`YO5!j;z7+jQ4lGn@ytzoW4DhP#jTYEq+LeJ2pC=s94%#@KVpuz~W!- zB5PmncjPnfNDmk=A(dFs7}Yx+1-!jlDv&Kg-UJ6XRY&aw`rDGB$iq{ZXrr##l|n0_ zN`$Ze9f8A&jeWVc*!3sBFo?V9ke~R*Y5+U9A8grF)=bWG^fvo9-ET>|cr zkWi;0;KjZ_EGxrws}7}1Bb0EPQ~2ckf;TCOVarlOmW-=`qdm&GD>jFrb86|=!&ZqK zj1GHsTg9uWYBrJmU4xd7sqacM3yTy1z=*CAZc?)z$NR7ijhB6?zxUql{YzbWlcxbqzP%ah|;p!N0N99yf<}}m%Z2_Sq%({ z*HbamVaMLhan27m4+{A+X|j@1l#`QnSjsA&C_drW?B=aaa zO{>pGgL!ofg8smoRS*%=}xeNw@>n{`ZY&wUDhB z%u+tu={*1Qeh4{YXh7BI)*auBKGgr0VO5#(ji(uO#!Om^R)%mcy&zYz$q{#MV-80O ziy<=QU*F|#7GkcOOaNr6x&#%VEfV=gWV%AH7xhPLKpix=6;k374@Y=d9taky4r8lP zTJxRXX3%8Tc3)iFC3FBG1q_K~vTU{k2cW47S{lo1-X9~3913lhz&A;OCBg^-ftFDu z)kwaDT4{GX0u?5b=Bk6=?>IDXZ~RYeKpqAtf4%4?acU^k=)7{BCQ?u(hSRa)+q(;K z+a}82$oD8d2>uOQHIyu&=_3z94^6b`5xGP#QlxngU}UYBA46{P6_0F^;ix}8YAl14 zH;Bk8AG8sxs;^U>ssvZktP*`Q9pzh0A^o%9MpcE3+M%;#QbeakHO$CkJ7A+Goqb+e zP%@iT05jLuqlTI?M~c`Mm7nw{<1ICUDOItTOCR|v9#*YA&yh0}Vr>C7i$!_s>s_7oF5&N_PD4Z2zm!iyZP{F+0p*`)V1kedEW4vTO2UfNgLtM-Mq>0VAPSe79r@z5mp_RC z%uMUMTxi+cP09==V_AxUR4)%Nvs;wi58~5e6Sqv_JBP~Y7UI3%zGx{n0GD%rK+qFu z{S_#j;iP!;JyjBbxUPKyS0}I!O}z?NI4%)UI_uZa)J+<{8TVh!O2OoYAkUmp?q-j! z6R}U6!9lHU%~4pQnUC1{OEa`SmxqURnV(?dt^R1-Z*1{x^fr>Uuw#gD4WakAO(bqP zQAZJzaf_{2cmusjhs-zbAOV0ygy)}BftOYhP;MSi?@D%s@onZiCIhbw)gLi7ap2U} zi?uT`(M|9eI%rEi|T5<`(sZ!~HT zhI%Xu76yGJaRU{%CvY1k8kJ48Z(L{2UYPo9(?Gjn(bY{sL=EPz_9TGgkDjFbyd;!pQ9qJktNsj4e4tB%GEDlgJY#SrZLvtO+`iyg`XdViuv zY@-9{lC2(Z!Yn328-HDpU!*KGcb9~Xw+)4W-D`0i-oL){3dW(97B<%SK&Z>ca9U!p zOFNA$>sR@EnR6G+`G$Ug6RPH+c{)zM;~yeJ{XoyLSqhH1sVGd_q0iT-SO~Yj39VR1 zM9{B+W4tpi@q$**j$^6)ncdrDKqggEZ=yJDDH^Un6_oSdiiN!yu33KG9OrHDL3M;0bx%$c{ToINqS8tTs zyZ7ViQ;WaIq}nu6JMWX*XbFJ*sPCHX`zJler{V2svbH!Ijk5dj_0-Ws$Gwsf^m-oABcgTjg zKMmh+<%~?9HS#gy^TClFNR)!zR7)K9sk0!-Wh?DD<*Nqtxotr`|D;%SAc`HJ`;vNk z#a3U?aKU>RZv$+qhum`qk>-|X&*kh2(e9f1LJc|Xofm1pN;aE!7*xzco?%w3Nc4XDgVzting{MGsK<&BJ(xq>^$*Rn8FS$Ksi6%es} zN94Wg^fk}Z#vV(>PxgvqYmr_@$`Cb52i-rKQl*DS5*l<Pou`Do#UFB!v!!y>@vwEtY1o@mPH8m3MtK%REtVEn#;r_8-` zHke1t*O+bW<%V{ zfziZS1^gWwt+jU=x^@2=d(8Ou%c-xezyZQ-5t^wNS82hzdzB zF&*1oDPQ3o0{D(}%jZx!KOjIt81=}duQj1z*z>pNUg~&f8DvLPf1wH{O0VoA5b&N} z-3QLgT>a%vQufAn-{#?=HW#hvmEixonda&gPPsP&lK*R#=^-LO?eM2x5nY~n`3Pc= znr9FSa7;9HD-VCTMVtBhTB|ywL-8;T0Xb|(PcuQBna~|~!oy3~ z98%YFEted{d!rKJpj4(6&180=VRJzS`?S}qM;0^WM^aKM>W?!A`;HeF4M*`g`OMHR zCT8k$#oRfZ!&Zc?R;=1}jFGKMD6bdLhJ_wy#+RIRb4WvJPFhz%6p&wujy1*4c;C>w4F^qA(;#xKo;!0l-(>x_;6ewzkU2!tS#*E{ z0G(70AzU*=JycX2hd4d`qX~3XPFVfbDb+Ep z*~<7&BUtmAY?5r~m{TG<>V8k(G|*R+`WI@b5!2V-J(*1XVEnEi_XCQ_1*YZLc-ZXz zHHjKP$+uSy=hu3c`tL&bFCT>stL#EW2nu(;<*cOC#Mtx^=y!IEH!KPqhd2#xgb`YX zJpi<^bZ;ZVS)GvpU3kIa^m+Nn7b!fq_T6)bqicYx8M!XZlKb25(-~UGWvuMmpdrn& zT(u!}^vd&tZqSkWkSfDQ&!?5f1wY&vcN!%XRgJ~b=p=qgiV|Wq6^8-!fV^{=(aMLi zPx42^kl2n?_$d94lE)r!e1D{OY=G_bX-N`gC2gcgmWS8vAv8mvb=0#!8~cB)veV)? zv^;ogmDKueS9!Cq7|#(fD9{p>1j$w$EUV8ny;z$b-R- z`mMc}Fm;y`d{G;U)tVGyO}cT0&UaRJQ_`GHMoG2DeH9*NCBS+CHwhWOa6nM9KBmfV zZU*sH*k6VN35GW*osSn5uqk+AkTIP-pE>^6;rUcUrAr$b5_!+zd_tV#-1;rBcB*Z6 z$3ruOd1XIQa*_A_T|W~Wq@N1nzQ4T*tn@E1AOZ{Z;gW40X0Z_j%v0lK@9kN<%-~^i zemr^)%L14@+RHp!P}^#qD#sYi+cuI1+d>-sMPxWW$IVND9MB?5mcyV?vChwr8T-^I z#s}rQGW!`|rtg>f8%l>8SFqt>)gKV}wzRoLt{T|4=0kd#`r9iJ^BtUXre&R}%xq0B zrQ1hcA-z8wsk?z@qa;{VQEC2DOUunTUaB%Ha(lf%mZW<_DgXLm3Ym;PVAl4#Xx4mn zkwEY10|{8)#i(@PZ#{ux??&7%7&xm-s!>a9>DwwfeYS=0WYAB$Li1vf1!;6GG{)v& zu(UuaEpZ&pHrSpKt%D?SY7E)uyz4(EGUZN$;`c{1xs=acXcF|f3qQ0k?p-~)RkvfiZ#(% zdqROUoE}%eEUOmP)1^cIcCA%xh76nQ8Go@#+@e8HxFl=NM;J@_49ze`j2v(3_&~Zx z)i%Ni=fE3i{wYXlMvZ6^q7cTBRE;p7oG*F=@Y{g<%8?ZkGS{h4E#ELzEld|`TeyJ8 z14sP?_8w9SW4DX`Bh<_aaY+@JFb!${0uJ|1kk z6YnNggLnG9K8&nuJ&8sKBKIwXCuoyFfC%i@tG)^dT9zOYz6m9 z6&b)t^VzzH5;Yw*7$bH2_xTyE$Gn`D^@7o4gg8L9LJoFQ{VzFH2kEAgp8~}kQyeOp zS{!YR0{;qWp;jX^#x97ay5W4P-C~*X3{6^Sn!r=1A?}TEtG1L||19M&!gu_4+VO!Edn@kUN4nu;$^zVVJrtSTwR#aSj0$D1H7ES@k zc?7!O-7H6;P<0)%%MqNx+cNjG4ZYnP?p!N_*H*_^l)zg-690W}IU6k^m2>`aS^5fc zzD;C~**Br%i#F|1fMS5u!9GkmdJhUh6 zvQt-KP%Lyk^|)*vjVqMRoc+;O2?gVMt3+XI4pPgIj|NZo1r!o{KD>k$>Xxz=*ub7H zj!Vudyp@8@BBiGx4o5<;Z^IK(vol{md?};rkUzq-tjXwmh%aA2^`QSbWGr)#S^exe zzujpjA9QmsW9*{l$X((mYqhD^jY?lY$~Q#k8+v?hZ{}(a3u%vF8Lxp!+T9BV3w9bS z-pW*7{4Awc)e6`AtupDEdM|hV&QBmrkb<9dJ9Bb^kesibUhNoSweOB-r~qLC`Ly2c zxMU!v*++0aJzhkzZ{VD{l)U5Nz<929!Jsa&j!y1VS~p7Vr_A5)3#TbSN2LZ=F*-0# zti+yL7Khh_g9V=!i(Me)l|Jv3F0jz$mckM|J_yUXmZ1!>K4e@-n}f<5+E!TVve1(4pUlnksN49`_-E8aQx74t zKj?z}Ys4Qbf+2UlU?U+<1^P-T#UUvZ_bT6zrv=qL{LY_R6sL4&msepIy;i1fFB4t2 zoZ?^sN~`Q$2Kxj}K=8bZFzUy8r19eq3czaoMpkgXG!YGr?UTQkw>fK3vX(i=rFGF2 zeS~gF)Un>UP9EHL^St_1He|D`~pN z!JE=2tc2=r27)KY`H9`5k=!>gYdZ!*zC;qix1scU5VS z&WQS~&kY7`ztIok_1QZp6KUPGFB?Arrh3QZ@TzZKycn0sy(aXqE@s7{G%-Yv2V9*B z^mBk8{n+9tgvi&l*0DN0(H0=;;(EM%s`ttjt5(gHy5rpY25G%sK`(eS_KAytSY4*8 z4&nR_4!T1OPYwcJQQ4-Au4=56E~zIO{N-Vi(^_*{$5ho~cXQiv)T%A@yA3I($fkUX z?9+5MLvYwifF{SLicv-ixh7h1Fh=M@qoAwm%G|j7vBz08{Y#PS`ufkeq+mK;c46$r zf;aY81dfCVKv}E0bENqO%bJek0j5nS7;)L?JQ3=H*{~3?CV7->CVBeyq)*=^Gw{yyRi6#ZKjnL^9>3E`d#bM!iy5&k(E zdzeAMhPYqO+#sjNDN-_R8rqOd=(9M3mhi`SX%DVh3>#WTfZPMlEgb{I zigcN6we6v40NAD5radFz^xu;I(QbzGc-xxi-1~^9?1c>I_xe2?J|$>I++9vD6z2{qf__wxjsJ484K-9Jj}DHC!MnM$h{PCG`r6(?0sBSW$l{30HK4M_2%@d zW=h9aU(`?xTjot$X6FZe9l7;6`}6CCf4SuPV|u7$a6g$IJFW_$Z#f{N(7jWZSkbKK zIr6>Dtb}*y4|AC{F(4LiZSx8x=gHaSXA^OtzMXl8rruWsAbJH8e*yf9KLrtd>pR{*+;{8PpV+IIjiHTe8yF+ zbM4`2>S6|U<>u^6#Pv?o5P{w+J!B^BFoDN7(2YIdAIEBg%cK<()EfJsch5{fa;H>+ zYI*T4hjAATILd(;_CI)(&Cq>?7@nCr6b=U8U&y%5&S#E8=Y^>{&A_ZhyJ!r?4Zjbv z_L>nG8iH45lo$zNol>YiR*L?~2&Ta(5(&*Sfpb~ziWb;qE|BQF1327=3LSU+Vl;8f zISKWZ_);#|9Mj7~N$ID3?s@=pgj7CO(Q)emhN3;l!pwZZou^|`p#qg5KoxhRzwVoh zJiIjgH8&D^i5{(J{4daLXfB9rCwEhCv$}mM%&h;|H zg86L4%sC5DkZkGP@u{dz48W4>KW=yK^5H(PUx0x>KVXO)P=$thT=)_gS#2@qHA`iE z+Z$Q*f23p=O5rg}n&Q=*z8~5MXxv)^G6D9*vkRh}GCo1O>?9i!uY$wIfgEJ(Pf*9@ zqdZ@s`74m7x8?W;AXY9*fAI!T(>>5HY4%118UI<1y8tbLT;y>vM-6gm3xU@~9;q-h z;oE9<%x&;0A=0KN@LWm)T1b#CwYR>=+aL;=YyhQwo^(4yIe4CB>tv>>X{SHDCY9R++BQo^50~Re)?f zc;U~JZwj%M7KX^5qO0vgaAp3qsmQ=ti?uKOAtDUMbTUFy*jgECJIh<<@yAVPvS91ZC+aMO1Rs0}J4UV*BB|Nd znnEqlP2(_#Qg4+(_d+G_L(%U=XbfwIh*82Vc>5h_jA zT={zNDerHB{sFW$GKQs*gjNNGmFOpL)q1JTJ-lXQj-CoO$^8cZ*^G%&HUvlGZN?n; zV4DpuY;KPo&X{k3^Ou3^s(pqoG8MjRFA_aXZ;M2P1CgY)7+v5LNBE<1DOA~Mh=~O> z7mziuS?*m~9eh{wS8>8?hd;$%tYX};0zN)?SSOVGaSm0g?n zB=EW)#A=aMmwhF)Pao~uT{4GAoxN8~oJtwV3w0{;`sK)~x9gGm!0Z4MrN^5#>p;A$ zvl-DQteK(lFwVYKc0ta(jEd_v*5y>p5Q5K*F4&4fpzri1P@rI;Zgd-BqRLw zW%K3FDEByu5AyS0#^?~yjr}UAxw-cR=W%v#eQl+*x#bkYGS$gC7i7T$s3FmG=;YwC zag=H@dTgV4uIH&mw!t%~XM!Gyz2`F8-?*g>7b4zdA`jS(P>mL6`6aXVo2YRt0Frgw zQp?&kegX-vK=2TY(<8o7PneA!B1(l~UviJ`%S#MjO=w$tlxV-)4>N?^QsPU^%G<&! zss<^R9iORAKv1W{TIw@HA_71PCJ*G1M@lZZ_hGq!+nH&@Rd}kRlHuXh%7nx{Zd3dW z6|Q+%#!eBeLC|4C)JaL|PV2NG-i``IE4A6$2%*~4w3CT!NLvVJ#$xzKk!#_hVSIGh zqMuaq=I<0_(9PX>mA055iEGUh+R2m_EN!c<9roaZ&({$4g7R<5O0EO%-8i`;{zOnA z%J>@eNsA9V@HG@@DsyE%;EJM=&A(_?8I`l90y;{j;+Ui zU19c5P2p-JuT#6AXxhoF`KuRdQ^YX%+lG5v^xW%`YPXHoMMnsec%%=j7_^u=_iRjT zHP%8$h?tb=&Pd7Yj#IK@Ujtdy%p@M6no$rsf?n1a&4{vb@yB`_{+vv?16v7bq_zc0 zvJ=A9>7m~aNH;qQ`^aj~*y*ylUMgxOaf?fVdLK(#A##qnuPLr2|F3Y zKy%t03YuKFpoGl%nzE5qB-zJ5WH7dj=IKKHVDYRx;cSFOjkzr%PA^-C+~7oDBPxoM z1)`gO=H)#QNt7bLmtxa`T=>;9?_&iB(azPQSi^X5_ULS!Jw3Ijm1^BHf9)E}UQ({d zK*^Xorn9eHhhqm;PV-t``17X@ty{-5Q$t1g*wXCTsP8p1eCJ6X5Ttbh0NDT*e)|u3 zx7SL!q=PeS`e>z^L;>&RWaJzRi7_6ThCzQW`)vdXH-Xk5%cMf^@G7HN;LJt08DAJ( ztk78S%_+s{T1pVaW*ff6pwV~T(k##KNg1S?ODN9GHZXPcm3M@?P6;yL77-Edo##9N z(VA}?4;`*2GP)0)R-%f}R!bi^dfewnl24#mT%eUwjE}H@(}Cq`vt(F-d{d`%SURl0 z76xcvke;PEPz!iLZ<6!fcYs0+R|-EcX$ZCT)qrN8`55s-qmpAi8DpdECerl#2QIxB>i9{6ame$FK&tkKf%t=ka;eXbAI(Hn0;_|-K&2wP zZ`QjnI9S2;6OpG{%ij@rf%Flq*qgza;e?2~M}>-t_h@9A%RH=*JL}ic_F;lT%`Lem zT5t(Hb>So?ihb@~unWW5ar)lHiswuQqzx(F5WghG9msWXFAZ3K*ce=5{AI25zg)fe zLw*la;O+@21@(K68Nc<6!?WPBsc1Y>ZQD8B80I;Q!{LZK)cX{%U6>c^&`Jaj?TjOiYH?5FAkMN2 zn^gmGZX|V~6%Hh7_ASGOZACzWedm zc{eA*$^wtnCIOjPh3UCwnnEwvw@ay=HbH|$8FR}VC+`~=?!aT!MAx8fWxU=8LhC^~ z$3*vSs6=Ky(qxk1a#*wZ^)zK)lSE+yKcMo0XP$P{xPuP|9@Oj%W!1?jjquwvAqMH# z`<0e_@BIXR<2<|TPhxI=zo9^8XCPPw0R{c+=gLZTC|@i;y~dDU-~>B`G4q-hemT&I zVNr!pJ#!*3u{pSrSdy(S%tEK|>_+B}tO{TtcPt^lS32STG zC2Aw(GHrm=rDlP|pf(*NItLV?MC+X43+wlEn6lD}!Q20e#SUbx&oGV&vXfiZ{%9zB zn|qQ6j%%isifwE)?1C@*G(7$ryBlr({n=)eO96u!Hi1dv7ddQ)87_^D)U~ACRh+ph z>wtFDw!Tn_W!Bp&EJU(L(k(j{&g2(;uKc%=+!(F<=pv&mgI@`;GdgsW0+k9R-!E+$ zM%g-f3DOx=17x};z$d@6O#ArkJKHmDg(f|53)`w3yci9lwZ%9DdM6qGSMY_Cl$(Zh z;ea+Iet!0`rlKhffjvOf8ao3OI$it2(f3M9Jl<-(uecKnr5>QHhv!ylj3(U7O(K`DSi2P6WsQMMj z(Ivla^FVzP?siF=tTS%sA!N?1xrs=ZkkA-DCAfzi>_P;U#BR@Ldj=3lLF*c1@;F4D z&&*yMwdliZ#TSeYUMD&Vu!AL{g2I8@CG^-X*=()52$XNUEHM3kNdM-aD%ThXdEG<- zuQW3!264zYNB_{XK67E}Ry#mAjj%sSP$ed|EO=TMH9-NiB^iC1C<_Js$@l5d@QZ@% zzIw)sFe(`IP#8aoI`|=boB%=i4XzL+=I8eo9}DXS&U5rlr_iOzetP9NgP-pnDNUV6 ztfaYRuyq3&vW_lnt%Ko;&29}Wb1 z;bUigGvLv6s)2@bbk4RD>v9d@>D@~weqfRR6l zws&X+T#V~wvbE(1_i9G&?Yt#uRlRPfUfmYhfD58pQf*oxcDEVo^&9^9w|QA!?(DdI zxNq)03cYJG-01_ho8OAgSor9o?H(IRcI|PAX4|B(v&)}g9^XyP)p5Z5^+2bG2Go}T z=FB1Ppknuqqm`_PqHt>N`ar=s04xj4i1m0Q&imA2b+F@Z)dsB-d#;!5bcRL>Oa8gT zHNXToUx1HeQK*XDBj;3tV8=@-wI7yAI@@BRt%7!BeCfo8$x%iT!vj@~}xIR^x!A$s5P&F-;k$_Y5Mpd*k4@L%jn^=?Wg(wVu zl>cESN1>F_y3l7Vl^?0A=|E`27Y70?9BmJ2`II z3Lgm`y`-c0tCTMq9=$nX6N z$ddjX36Vt~UbTE|6sZKi*N&%88~(C|^Ur&yL`u_YnZ3q-x)w29CY`Bfk=FI0e_`)x z?c4WhN_`j2c$61@qox7apjb;%h|+{6kMU?mnFW}Q8@y4lbOy@$lvu6`h-2cvZ;nx2 z0&|OawrR*qcQw>16`TZ6n@buyMIkj~#!P)zh{ZF4wPeaJNUP2&Uc!ULG$~<8a@V53 zF^S<+k2XBi73<-}K>*HG>Cz8=q1xR3CD#nX=)BGY(>7(7Hnon)8St4Wm037a&;^7@ zsj!fcLvr;cB}G}i*DkkZH+KJ>(NOBpG;Mgb8RXVHYVuHV0RZg$_^;ahQZ1*tGE)SU zC@^E=bQ>Q`f2EcXM-RF}0E2x=R(=8nv*FCm83ODyc#)4MT4q6Hezk)>Yh$#2(~?ii z$6)6^7TO#CzNya`|yfeUg9sSYaRY zW9)0)GhogAlh8Wq(Af9?z9UA__`qxP2B3M@g#wFvvu`&$yZrI&h>dHK9?=J4`KtJzEX~&Z)VcqgRoqmqO!aB)r zX#xD+%1aA8ji(eFy4MpFN#Z(}KueNKKLlxP)dUfz-9n6ZUxsKOke2N4^I2I~XwE`y zHFPDSvqegtR{t<*Iw67g!?0ewnqX0=L%2f|Q-?OnoD?{i(`U&J(;F2jC?Y85v}TGu zTke&8{^BxcHQM!?$EwCE7TO4)%cjkWC5^}lp!|(1y~EYH#)nPd_es*cX96yx}&i@nFQ?+=0P_4J4>wt4u_7oD(s8;%t9V znh(QTLYBR8wH;fOKSkDb%4J|OKnq6fB}=$W#w%k2P7N53RtVom&#e#Iwz7R$ot5P} zUUZ=@E)MoE=zn?exZG>my(Ql>7=4RcnEc|Ha|H`_*KzU+3k&}PLJbfeJHHVHNhhrB z*U=Gqns|_F2cyzfUUODICo82}JMjWQ-+Nh^v{fe&#CP{~oC$dwy>RW0oy6+f$sT&D^}rtKY?kb61GX8h?&>46C}l1Fjd80_c6iT|4OMFO`K~ORc!{69DQDlw%nICdAG`*PC>hwJ> ziJsn++|2;Jd%2X}QzY!qH!!r_sQTLM!lFoZW0Yt}(tWT-*4T^)cwO&%oJiqh2C1oHyz$UlZ5E*x?4(8j3<_M`f@N6dMEo(svVXdDn(Ht8{)v{a<60}^xo5aS)PAn0aqe;wI|v*KykZ-mhMZi*~6apyl|rZ?QadC%S$W8SRVNW3<9S z;H`)woHJfi`JB))&`Oy|07p`1ad3CUU+w(`U7pl4xk?;##PiN;>jTMVc*klin6O>s z2vw>Hol5qqq;(_~572qvN1fbW^5*sq=6R`pw0LJuwUJX}qPT*_U$()0JoCg(@TTEF z%of6sSg~r^PyIH?Q6c1yprG0dAJ4C{%<3=S1Nafi;H`|Jvq%W$kvZ>_!UB~W#G^l3 zt7fhO{f$D43Fx@ci#f{w4%3V$E6K{yDSOa+d-3Cf1862XTy8t6NM;zrn1$i-1C4YU zk+z$>GM+djn+Qu7vaU^p@r|UpYtCden82`1?fFN4g4`0K%RBl}#Hr}Xj z_RQvHp@0APgaLl$eIzuGN(?&T1g+3v<7)5Um^Vc-1SFe1N={!@W5IX#cYF3wRt8Ch zI%z>cB91?(oRj3E=l=mSK+M0!)?oApk#|1Ahp!ooUeZBla@i~ex%l+@7jpI96+tN1 z@8%aKZ#<#oLe<;jw8yp3(mHc6AM7`z4R{jpZ4?plpB@u&8T-;SYiMx4Eb>7oEEO$=@#`vQ}*{rpv#mKw^yAKt#l_vC^ho8@6q6 zX@?Bw*c?p5SfYC>LJB0wB7u)r1Z6c5S-oiR2b5}hl0Q?{fw)ZxtSI_OHM%{g*zM$- zlqKC_e$lxA{)zRmjk5SdP?B%>ixQ}%44<6zz;bvqJ-wP-yr`2XFwB|bLC;#v7KhQX z6~qt-QwpQDP|Qz;pFs(|pHjaLG8onllhp^JY0lEn+Ok1^&@gk3jAzEg?n!eUh!52g zj_gKGZvg7gRH7q^PjU6Q=yc6=5wecOhWpO$Yj5yFKl4cg*lGdzZ~EO^QVbA<4;52F zLS`9;D3q`6+f9;g<@SS%LVfZ?GRcw=>qYxGqGx12{##;c7(dv88Ru2R=lP8-q8#>r znZ#gr{M;)^w1*HM<&>3KcU|Az`eApRQ|05Aqsf)-nOrNfJy0Nky#17*{}HkD2&ELt zRfVu8qn};uVrhe?M7W)Tye=wyh^*TdU-$BOw2tNCj9I8gUI{uNFrL5-{!gCYqO>Qd zcojl%{5F8xLHiE*PN^lIm6)sWs?87j*qc(8klWHNr>f)rQGGx*OkSqRZY0gq0i4Wb zx2$pF0j$rpKi3Yi0WdyA4!^y+#(WP`WN^R&<1Ts7t=swcrjA>w)-s-*Em;k9o|ZJ7 z-r-CcjKFCp`2lO-JgpZ7iPAiP>oKlvtC;$h9#7=nopx-5{HRK2+>8CsUi=}ypx}L7 zNNj{~DJcdtt`5vZEauX(mP6A|VkI+_EJIYeFJLauSDolxJ%Yvt5-9<>rxZvufdNyl zfi|->Dc$np#iy?fEkI|#)Mts-FmZt8${OB->`uU4Q&ZixT6jED4XbID`x|01>C)$v zn*ig(=XTO|N?-jQL>Y!J z33wDSJNEXMdI-@O(va2H=fnsa2RN)ey}*!8pQF^a@*DT)o03KQToCy$1>oHcKK>xx zzntfN@xx?brZyb`dqh*eG;!?yayNs}I~1)#MPvFQ>V6h`l5psm`){=;*|dN)1N^h= zc_*rJC#R13()*5~KuzR@Ybk0hq0VdMKlzvHA9gTN7ZA|dyR+^Rpb~wD4cTQ+&cxk* zMW=^1-U@V!0~M?UJu{)P*6^f&2S8Qq`X{X&ln1(YdC?P$IlILzp&E`X+Y_b@X+0-PMtIDPJV(DA4So75Q(F{5F zZtXFyMzMU^x#NdlF}Hja5U5c-bW#p<#8~H@ePc}wJfF(VM74MwNaRf<-F?0QQr~T` z@+@cKx<{$G!EE`l`SCAG!3SY0sOHO7YU-ST2{6aoS~(^k{8`Plx7&~f3;=)w;r%~ZD!>`H8Xf`%2a0S{k z6C*abiHQ$r>y??{fjWF8GY^D|c6Q_73s9*V(?=984ST{L0Ozha+a;p6Yqu}5j%epK zh3lBr+^yw?ZY0OZvuhMN)cuYbrThr^5&pT`H8OjpaK`i*Xvu6pcqhyb)@=(^cWDQq zPQti_Us<3loU}VKi}gh?HpNRR#A~0^Vy-d~4?aU6m`5*(&QIqRDQeW<0mpYMLd>BK z`>&^rzXiaB43LWx{bTOW{~K}ZQ&k!Gkw@^O?<8KE5)LwNZ#o^`c!N+EzXNUNVLuHd zzT5J5G4&5K4BXGM11M-tnz*P)#XcKl{6Pn5yWj;=s%N4d#?5?BS$IdMtLQ)H3Ou<^ zV0bhp*VZZANz1-8!}kSgdfU>1-=DIuM=$u&^h^pJViky+7Lf@T zaL0!RW{0uM>o&!i7Q6d*3mjXuZtllYG&&unOD7UPd5PFI()TNHtDKi&R1ei~u^>12 z@*J(|;O446(X@D*^EMWvxPEgZ;){kk05Y0xq5^;jsOhD32f|GeXsKf;dbFzHr!)7)MOE1Is>xfW!!5phj_RL7#ONJ41K&>?%D~A%i z)KwO}ep2u)q>lPMcpOenKNW<;XZGo#BFH@HChw!0AFs*~CZeSP3GRr<4x^Em1v79kDB~MEG#S zoZf+9BWhGmpnVtQgiU41R8WQyIVX@m=AV5HguC51)~!e|3y3dvc1z*`bRkpiZFwsMg#2ky&sCUMSlqDSEh|6|F zwzsDViHAL{2#7rs4yoXAzA-f22w=RELwd?;vmeLiF?l(?Tdhyp-Y5pTrwAG4nZkvM zBoiTdk@7hAtT$i8_1EHZ-4#%`ze_q7#MrCh_~#(*Hj3@0@%)_0=dj!NnXG!cIc^XD93|_hINxChQ#fS=4hS)K6mZ0BjK)K(*7PsFl zW-$ch2qU;bBY9XwHu@I-KK+XnVVm>+g73lmSwlh}!%7N9TKSTxAioC@b z5O(Om-;BwoLMWq)9a|pH)W^dGAX`klV*U4%&B?XgKZTce^rIbjQb@Gt416{gDEOq9B^w7I&-A(s(+0vxvg0DE65=4xXG0nopxh%ylDc~n`cP# zy&&!W`H!GTnVt8vcmuFiN>%c^^%i`>AquuW>6S$VP&Hxt=W;g`o;jiEqvXCco3Tfe6S~uQK^9yrK zt@@he+oybKG%%=(B@($5qIB=S(oBi{L?b>ft7qj;=2V<$5p2KraJro|oy&3jXf zp^+iptX?}_4rIIel(T9FUn>nIXvi5+OGTv)yRUMBwg)(ouv21>c?Y8HQ}{shnL>rR zJADf0XgoBjcQ~2R{HV7U(U+H6zZc7$GpQmMNIC9SJa6!qoq9fHCSWocAm|j#55E&F zHEOU1v5H2p7HGjC%ATw~y1_lXoH59N62!!GMB&pvh!vopF}_v!;`$Pm-%_ z0kS9bx8XZhdn`vt5&8LkKr}}_CW(waK__{{hLPe(ZI+JkiJ6(0HM7*jv}n7tkx#Ur zp@AGTHRyvh)C}h;Rt-IcS`sb?Ib{`2HHg``k?5Zd8i!H-@AOdzkDUHCulw+n0uU0x z^qn>(8vBJMD6Rn{BcoH}kf?a%I53Cw6`=u`9UXQ|*PCc%=$`xzMg(Phx2W4LL0n-h z6g{w+Z(yMSSPiSY-&VzliDK(Yg%8k_MPEv@$U>s7M&JD>5umT2}%h_c#wo2l0UAyE%J3w8mM7+az3gJK62LGm6t;UI;6?XaO} zJ`c%0=qk+1JIh?bO%CHQ*g-CoyWhQU)74o7Oc>wlK3V(hr_`tlT^`cBhsb6U_ zs~O?=b^Qc(H2aLIzQEI5T=7XC+&Mz#^o||bMLg&G=ndq)Q-56PS5|6sEq^etsvfxy zcM17E*i4@sLF2(52>fuc(M1Z0`c!Npp}}HOFxR@b@bIeaqg^=}d?L8p)AmXtJJ-1} zn)nWJX9p7?*#<`z$-uyMYqlqU&GmH)XE@j((Z|&zA9(+fF1-XQm}HW?M`Lu=z0Vu) z-xI+)0UT0ncOgb*_I>sR0tISm?JeNkX^D#ZZ-l7L(~Cny*8mu?lWD%7FviNmiVtRsNitRUPUl)1Elya7ayO@@)0e7Mp1 znY{Yf5tYt?$7;0!2wxnu%Iy5*36OLQ33@{m93B(|r=NYqa8hY)+{)0$z79PVvqyd6 zxgn(~x30}E7gayUastsg57Ni0DUOL4%XDfwpcoW{u6Mp*>Kv+pQ0m`NXB)h0IXgRyfb*K%1;zD666e~_+7H^Gr^aelm zF~Dthb<-~>JrRBZ*o+X^pU8)tWXn{H)+^|JdZ-zyP4pb_WWb>7xk~^Sc|;`z|Mny1 z^Atka*jUm|9F=vC;>0G4d&U+8E6`Iw|4f$`JxKdZ!cXV&VtODY;XFbuJ zPD)~cRM^PWw}H?ZfXq-Qx(-rnppRGkZsNVKAgJg}q3ADY|AKteOC^$EtuucWU)tZC zeC#WO!&8Hv39)S1HQmEyx^4Aq5%P*&4Z=eNa=bx$>yy^P0Ct zfe5(|Nv>{mETg!&`|3bl$9HwwNpA3!lb|11>qbwrnwLWyyTm(suq}>4n&<}-94BXQ zbaf#Cw}{ivMt(37-UYD#E`p51g;XXs%ba3NWvBLZ@Puy8W@U>RFz>!t&I^rdqbGNc zZm~>PM0CqkLI`!_=S2P0iRp|7h5i3Bw33Bn;sll*%Qysn+|88p97q9ijGmh+?I?oy z`2;?}E=Apc;+?~9i^x6qYG-MdolN2l&i{}lrie&b5+d%zjQWN8SRhOkDW;mXgA{~h zU#0w+w#&m&kx}M*)OOSTQ_XM|#roX?NnfMNAGu|Px;qXZ}RlRD)w@RaCUBE!W6MRtnuD zd_u!RO`a}jCiF2YJ@`4`yJ&kW+YAk4u?1_nC2xAcr15Ctdie?DW4tC6{7-a_wI8m4 zi78TbDP`sJMPSu~VZ;)5)8Bb&_MmA(c_1%v&Grtb3%$?Hw}@n>w1~okcy1vLR*nb# z0lW0aJ)2Vr+4?0)B=5Tw-y%K*xsKA|*qPun(`cq;K464~=Ozw{X$r$c)rIS7&^0`U zJefy^EWIv>WtA%>1*e|8lf_z4uSgRYjsErXDCkT{3}wn@+~rFUl}h7w{vIuLU9r)_ z?+Iy0-{Kb-5V^>!DzCj3I8DTG48_P82<1#cL|~V+$z(;5>ZejgaZOZJu}I^3n7jFT ztYE(QU@89QE`0VOOsdi|+D`@@&eN}cKtR})&ZPv+)n9ZdbxT)no=*4+Kwe`i8$~Wo z$U1Tm1z*@>nnb+@JWOO2e3F%6z$(Ob6seJS1`g)`mtn?4aaPJ6bC(g`Hu7^-m6%u% zrLoEh_hsw3W?pM>XB%Hx+QPp)v)g;Ig3tbY%PI?aTB2_PTYpq7#2ZX5IpUlz&RiAa>4$@qVyD#hhVXY_O23gBw!(_f z#qy`RCbMHQBd$}Ug%nf60nT9Cd9L@Itw*7V=$F`%KH7gkyB1CDA}o!Asp<;=!^VN)_JHpxt*qEm)crxN z=bZW*!E>OSl${=Fh`gZd2~BUa!(Y{J|V4>{jv7ks5Zf9kabbCin$Ps!sGb1=*HC_;(az% zQ_t4i)C-SM|H0rAI*%iFYC?b0#Lvm^ywH>K{jYW(VZM$l+FAuAhr9eNJS6xqab ziip7Reg!D4UOMB~(dh4WJ)f3f2gzi5Z=r+tra&D`znb-$$eCc$xnoTItqYYOjA`Xp z`iBL0l!+jteI~AhmnMEze!F&|pBBeBO{UNfYQgd0^HDY?7-ja(euB>RfZ1D5>%E>P z;=u73G09jJPz8E?s;FeMZ};#i0`U7%M}nAbor9rvoMC z@H;E&yuS8SzjSPapiz0s2Q=kDHHO>iI_k;SGkH%#Aw1jGD&vGs5xRjo5Z8B}PH+sp zLLtqTE`_X?fIM#88ntg+Lzhn*(2z$aUz{xjK8HnF7$W1j%KBV!ixO7pCfN&U$YqLZE&Qx%p;he;`tctYHfMO_s*GK9WM->rzq3^L~1 z{~$i@pJtGQa9f8?DUEZt18e73?Po}{*%s^q9Td7t(LoJCh6otg1@`VFY}hOU?deUq z;snElAQ@O_EFk~|G|()oBJR1V0>zr+)wOnIWDR2*AW}9`(cj{-#Q1PWhdU_J))-ao z5iuZhlMOs#RhnxPB{gmwk9eRu6LMLa^?-ftV(_z~!h?0)`W>; zgbVrFq~Y@XxaO9GTZYoYkFg(`VDqcx|6g(5sC(ZvFka{Yj@2=_Oh4QFY32>0oOt9V zJFtc*1?7*Nlh+Al-TB#MKzsFmJMZ)|3F}QOe;79&d-S}>hDzU6DYtp4+^u&GBcZ&| zk<+>xTjw%lsfS10qa(#(wDk`X8c_6hLI4L371IlYB*qLQ>Ixk86*htTX~BLIJ=4u4 zpn<(ah$2L>3q7P&SyMLqz0$6#T}6rf-if$-?gKe&u9e?A$#;!72mQHscBfq`li={V zWm+6r`yQ=n&ZM+?m4djvN*}>K-`&)T>erLlnH(i^<7NX12%~0VK%JALL93ZZat1xy z|Jy?9vdf}Tt7h1-R#ZY6>%%bc>r13b#d!=O61{CJ7O`@Yg+=5d=*p&sn^#S)nIu3R zz(1+3q?-iLtf9>+`S8mth|PwZbYfJhBB-CIRe>a!DP_kn!YceFUrR5UmSEsS&M)R> zLRI5B@ez8nqy$(bE%+6d#MZrz{x60o3`l|si#2+hw}Hh_T7EwHATF9ye3T(6@%^BR znZ}VN3BHpx-Q+fqRb6K2*`^9#dfccSpk3Cc>I*F>97YNTv{#vjMw>i{IPn3PAU9+h z$29vVkH<*oV+oKZKeh#+hvgH7K8KQ+yX%Z=W-q=*L$F1&{8x)4jgy3*)$oa&~^6yYQy@;1~_`z1|{F*r&CIhYAke*%pywrRn=i^nZqC6 ztztd=UqwQDt!fuxv11=?7f2?o6=!I;8a@gH@4mCXgZ9X~=FCh@K-~j|65dP(H8s7E zRNl5zR{2r{i*wq4c95e>mhO%sod~Tfsb{A6RlYd)C?aUZJFQR`-{d_AamTa3)au*H zo8P3`Gdd$i&}SIkn+TYydoyd=*s)UIR6;vZKjIXdH@#c(Ly9q9L|chbTxxRn%YO?s zPUCh^XZ`Jl^>46ZaA?D0Ad$9HUvASFfTm*$qd;dJr=g36Jk3q`M7XYpdWOL|A zOJp0(gEZP|w8+d?%ZIL=$`sqoyr#(j*%4W$L6RXAKj1Mp3h;da`iyY~@4lgeZk8G_ z&mynpK7%@LyW_m8RB`xuQw;-h8k?Qkbwua)BpG;1z|p1%KT3xa%Fq@-mNN`mP&9ms zuA;p=)ImtX5{VvV`8rPqHpviU|M?XMa%_ICTG|c8u7mbDx{!c87~3HQ@-i&{{@#^- z)mLQYb#)@dmwe8w9h<57CDmPAkb`-@jlKpL&4%g_+3GrcibDdGil6jsXR+^S!~dw? z$ATF1ypTK{VApLev8u9KAM=kp;z)iV259?Qy+YPnbQhfYwQrpu3ncfR;*C(zycn07 zm+4olUXzZLlP|pUdFBWsV5*L0w8)hl#no#u4tL35h%&GYRtf)uPkI1K`b5p6>^JF= zPG|&W$`ZeW5c3SFzOF~{XRBM71?wrls!HUoX5@X+cr8$8x*QpFm^;K#3MJg|ab&*yaL*q9X) zHQtsR7OYSs9Bn>FiR!|9*V%)988x;vjCExLiZwXoA6O^mfX#2$ZTrbtf*lK7$l7{F zl$hVM`wPn}oXlQSP()aelVfr6yx#G~>>(FkrJ?D%#QJXBA4=s=Cw+qCk;6#DV(ORv zy2{R%vFuhaX+T7srnOy;-VY8?7s?Nrq^WC@6mRmm85Mm1=Xn!{O-@Nhj|m^4OxbHW zr8VfbdXM8iJQjeWujjlS)sBJVHCfOKe3zNpF zruaCr_lkpaNpDcI73)(qoBJza0fd;91JN)4QBn?nK@&ciTJJw$WuAi}-I3NXL1mf&r&>zH#!wvQ zyUW%dYBR$v!`JYEL|^LO?mm=7tUrk(@T!2z1Z2^z@76}JZNGyqttR>*>6XdCjqI>r zJo5?CppsSf?dn@y0I+i{>TDg0*}I%bA&4e_j!j*{zseN|vaHdGU0xfJVu;5pJAohN z0z7;+7U0B|k+S;c&(;CWXIuwlP1xX1rXo(LAhpLl2~=9#(o$sqQ7{XiUYny>_nvhc z5AcaYm7*T(g5$AnK1MMmP(QBr!|Rmsls=fWQg9+74-=4^-ahaqC~2*s_)Hd`HZxjY z^JpIUw67FPMDlI0F1#V4{X8m01L6;eK<)Rt+LCjgk0@kT4F>N2hoTPj3-2f`H##yt z^wmX!2q18?RPEGCs)(o2;jNFEb>}`K9XLd{A!i@XGa@W;GptB`A?jN}WQ4N@Y3Vwo!}YdL<(2#EY=!^)s`;OSB1 z)`ploW_^k{VXagjyI?W6!D29q5z86|U8NwQ>kcf48GmcBe(K+cZg*)H0Mnv6Ohd58 zFnfF#ohxL$$;EiLBt4s2x}S~&_6^{XQ1}cIK3lAv?(397%hZlJ=2CMMV)d})l}4fK zw1TB_8U=|c5rNvTc%%!E+_Fs00g~}8tv&#@Yd7A;JSJ|gr6M&ng@Ed*UYC$_gY6bH zuJ&B#O!u`D4V@qDHuUZoolJ;zx9cW$(`nyCm>tCYv~tG=)s+IgoZx@1WD;rGaZ3l- zo6w*{G{+apW;|oir17;OYHxLgc>Hz;hDLKe9T(t;Ul8HkNO z7JoA<)Ea&Y9k*6^hn2>A^R04WFyQ333k<#?;5Nt2&8>y^HXK?K!jBg{cCy@|@sf~h3d89v!HAHsoW zhSCdeN`YSG@fJ3s!%xD!_Jpi3pXZt8ZDHqn-E|e~Y7{Hj%rgiQMrJ1cCcgQ+o&RSEDX#xmZD05J1eAf!(&yJnTyVYDTbMOv=1@h)J(~ zXASr8eKEJJkyp`ym~*bnOVgt8nKWH0`@33F%th)O#Hf0U|2jT%*EPP4O}b2|kJcAt zT{2hjstzaf=q=M$n{_4%DuU2={5TlYxLVh?{b*WrP85HS%8ii>_s~E< z$I6{2?gUyRs=_Lm*1-jF4uJha?bZ|W7IEHIKonWXw8Cihc8RMqvEI$!ZY!qrjYEO* z)lcCmmpBztu1K3KqEwwRk8~o!UK@K)%tOwX*gqa9bgw#+WHg1C3#qU+NrXtp#>ul$ zD%I2d@Oah(wf|2>EQS553E$T-2sbAz7w}f4yveC6!!ZQ$L zB9_R%kH$7@^!dDVmNq`9>xRfv@!}4Xf~Xqk?1KXEW`$(Kx*73juLYd6*c)ChaT2cq zQ}Lhg<>KvMrSEZ(tz1faXK*cn-*k%@y*5k>9-c7ZMxcj}m3Uc!O^xNv$809l%ax}w z`sFhLBaA~#^j;}yYMa{vA)g|Ex!@&{Zmt&qXTO2ymN4j%?qUHyeZg6c|$xv z9yKuG%fXpLPI;mks|4);pzMckTW-_>h=k{)!*>Qh722@VEm$4)gFUJXiZSm7$lzN! zaehEM69k~wT#3YEAfP7x1FCz3R28l{3olt3XIzppc`y}b_sAcLA4AV;sdQ3*!gmrc zFVGQ4YL4YXBfnx+%s0vsFi5i=xmBa3BaAQH*uYJE3m+1MN{sj8QGNfxF4pvQKTEu;|4GI<<=raXE(-h}PUy56h za#|#HR2dz3a_3;COvW5UnM??jhEL*NYjy&8*O}glWRtK&F=JWhXC-2@4z4l-d3Idb z$m3%jx{c`fzj)+=uCj&-{3*QMf%W_wzy3Bsk)!SwztNstu!^%!7*f|})62ZPjo2$C zG8#4=4PJX358m)+TNl~Q48fXZG)DzzqP+1 zRR3p|X#T?-tX9`nXsJpS!uK=v^|kw+v<>?}jyMDf8R9_pI%tkcf_F5p-GSAZ2Z{Zr z2X_n>!oK~!|9h-Ba7~cy-92r-8n#I{<*kgM9WvK0o6(G9;6g<-vBbeP>L`B~p{lNJ({Vz2(VAp4lCyX34)t0Br!z`0|eY0h(U7Yc(O z>XFVSE7PsXn**Z@3StUtJn*H6b*{^yPS6hNksuW=pDT;nJK9?({a$V#U!sSX?|C9M z;uZAFed1)OdB{F6o7hKfz0`fPJK}&-`U;gj^C)(NsPJ87(#S^M($2Cp?nwYQRH~KO ztXdd3_O!p4_yC|JxG@)FWj&ye>33Tfms}~M=G}~&M6wC5IHNe?US~wAvTa|1;4pT| zZp9+A)r?K-!!#=UWG*DrQs$y57ixfmb(`SfF1@t`jca^J%&Y8iJE%Gx;~3n;rP~$4 zY~B3uytcF>Uk@mYG10)WJg896y+0W+btdtdUVnBa$*eohs5TVThy?Kx=%`4AZ%;nb z-iYVjU})NJdPIHY0_VtUw=Jj_LKov?_2q*2uWOO$I4HtAw=?d$y^E`A0N3NRT$O1B zR0m@K$n(H&Bb}^mr^x#AV*x259%fqPbmOx}aFf`U%$PE*fXGTbC=QDx4=I@i7Na$U zu%P$2Cz7TeS*O<|S449Y$${%lMrDEAdEzwomTUDEUQzJKaX%X>WSu~1ud8XOPr=oL z8}X%fHOH9K>EpPY#M&f0>8xw#Z3~gB*9XbjIaQLsyB6dYS|v+|U>i1%b~GDBAv6fx zxzVod0l~<2RWloA)md^%<_r4PblH^B#{CRRBG~tXX46aZNL*25`Q^-I7=lAnmq0V} z+Lv)p!b+eEkcrLsb@^w*9T#qGwuKj&2@@;XC>A^^y-PrhmlcU7=kphqG!DqgXCZR7 z4-9vW;{C>i7QFKlJ;Tbw=-ZmutrFho8BjA%GXE7HF(x1jGBbP*a{6Ej-W zb`vuyN0$ZB2bw-$@Kpd+JHrc|MX*IsH@7^8E9%1C>yza5dCsJI{;-eN6LP5SBDiuX zMUst;q2u|ORRiiU34|4wbQ=$+r5J&}HEm^yI|Y)Qm33Bcg|Cfn)j&q;t+RE9@0G1a zOuk8i7E6t}rPit?fUBHYPT6OQ5v8#X$+R&gk3V{Y9jl<9tFO$?sis zTKpCK2+im93YVdtYU&;AiPOoTVcf+}K|8QuVS|yeIM69!$9n>2RobJ${#?)Z755bb zlWvcF1@s*3ewT@$*Wl}Xe=BT-?wewW0PNDKF?%a9MNQkt5B8&k{I0sE9B#!V zAM*EvW>?l)ejf|bX6WQz@X!uy7@@QVQwL6f8w6y~nk14(01_D;nP24dI4`q2HUq>| zgQ$lN(;I|NI-_tc!cSIse4d5`YvMEMRp&nLc|{Iu3m>etg$K}!!PVRrnjkG|fD&A& zMTUk$x}rqaB$lh|$d%2r&t`YV%S~P1k!wjD2KlAfv|3Q&oQT;(v0f}E2#7f?P3ujn zCQx!m&8M{(jU7py&BGKsl8s;M)bc9*jzG8i-Gsfc@^l_Ye%}A%Ysh*Qj{9}I%&cVI zT>53)$_s}qaU?d*L7tIDyY5t*MIdmN*?`-^o#Yc3)3;Vthy*&WvKxFs1#VT0Q55U= z?7G6OEz&^;xCH;|hAH}a1*V?VsyI8%U&E(Ww8^0y-h;Wtc-{3#n{D^nEemQRk<`8L zQvVvd%@v9zq;gIqd|>QW-fIGewA~2aC^ST8^OWmV#|S}#pbL=T^oEb(W6@jtz8j|D zF2C4pHjs0iZD820e&{?%zMCm7c?ZUh$sjL$YZ!$ENwlX-`y^IF%0m#hYsBj$FI%Ku zNqCZ!$tjrJaRz2(^)|mazOp`1?onvqwW$w7W8O%;7sQwgg{U;+VC!GuWesa+-93N7 zSIC4A<3^!HfgP6eno?}LbLIX==?22gz#tT&gR-P5>BYkDvyB}JzFrL<(v?_+M3|i3 zKnR&{=^S09in+{JC5s8 z(JoSw2#x4Q5JM&0T4NR6#z4EDejch#Zso&IV+m|01(0sN!{HQ-V!T^cg>goQGJT44 z%xx9tS>riOu4unLswr^cFKVN+kuE@%!z>}IA1u-ljG8hkR`B73Aew}d*NhOwSHu{1E4**eo8k_d1M)@ zjl5}G(s|^hX}_N~;Q21pC4h|2TZ{oPZhCcXeF84lHHeiJ8N^}z_&;KgS$4K52pnV6 zp$%9lTlMX9MEk5zb)0TE8-QthZ}HM}8Dxqifh+?fAn>iCnE=_#e+Awj&RSv90#-a1 zotAY`wNL0u{~Nv8I+tI#0IB;RP5xM(+H27eEUKBeD&AfP6t=%FuFBs_WXzRUVY{af z|B+3LaX+B2Qwd&{2K2`ho^5VOCtj4_&1H|9=bQoiyB**kJ>$;iJ4B_v8U~-?l3MJ8 zzTX{SjDDMKp`&E%pEEBH><4=SF&2IE@Bi_N!;f^24oWtmjL7I0-TPkM4s7XGyerKq-nijIb&_K6{cjOza zIB3-Tp5W`@ER{!ATlWu8u4&Wfhu;@I8P3-5_ix5=R-wgz_ZHo$JD97t*Md0N(Z_ix zS_5!P{*Ndn5Qbvd9D@zDlnl%7i>GXKD1F19+i9sVU(P-4CEV+gcA>t9G=N_UmUvzB zh;Tc`3Z^dt60I+J3qmQvu6SJX%hGA~ZVyRh1XDUFUvGFUnTdD%=m;T^a1xX04I1hE z3gKL5gSwN~A_R0>xdG4Ht*ZejRYBSt!7}_vrkcK@n^_s}FBguWjL8$sr2L`5jqHI8 zFa!d#Tb&Be%83t7Qz00dhpeW2-WM^X;7^JJ4o4`4w*gt{H+mG?6gyAg*UV$UUZoCJ z)@yU1@Fe|Jg^e1o;XUC7C-8UWFDn{Uor_YT2+4nKdDRT$iSvp}8oi*9oITGu4QN+L zpJ;msW1qDOYF+bH<1Uf43Cy^lsuMrQHu*U(Sw=OOE&VRCMbi(eP-ah;g|oiT9UQq|dCf7OUx%tVEeP^>n2#K#V%Fppw z1Nt0gVW%1!0hI7H0%MwN=pWxygZ2Se^I8NN?$aF^ax%^p)bmmHEE2rsA({sSPY;r4 z4B#~hTS|Y|Ww65fM{!-eqUB;+oic*k4hN$QL#?&CijXbYt|&?DWA)Fc`a)~ za+ubYqFbHULHn_`n_elQaiu?Tamxws*B&R!;Cr?KmwMI}^u7q**K}ON#q_sSVP+LM z7gA&o@Q3&$KD##~b2A`O`M)FV*~{B#BNueq#ir&c9E?bFW=hP3c2`rbU|2@S?zRKj zYc00tO4#t<@3lXb-extl^anvpy9DmcgMiBdWl*|%_r@GS?kicMZsx{;qjEow25Rp# z&?4QcYTtD$#z7|fE4%9Td>2Aqt9~m#O>>X`_;yfvGh&0#KBb;kgqgW(H=mv~?)+7_ zHoV7|hfhb3lOcSykl?|t?}AvVK+uB94xXGG6Ql4wpM3#tRcQ01rT`T-2;P2Qya1{9vASf>VCb`~qr}hO z&h+^54D#Hij zW%`WjI&$m_?e4ATjI}KVpYzexD$WF z(Ge3@+WZtQ362wQm0EA?CakkT8Zp|~Qcl~F0wn!JI*=~NUuPKKZ(~-FJY%bcjIdt! zJBW%eqyuivl~jMnM3+}9e-*R^^6$0K-aRLv32r}VdhQ{>mXm25Kz7@jDNhl0e`8x= zGzadOy>1Ofao!P*0;8?kT{A&@J5{`p4!uB|l10jzpQE{&MX}~%zGZ(e;!oW9Vh9rc zac&3~lBgll%6J?$3NQPl_FjQcC>!)GQ*QhcBB2Yx`M+Y)cuy&JGYki_cH60ThW8~d zDb$x)8(+?p9!;^PFffKvKQI!yf}l8LQe7b-36x;zr4akxFPqRFjCx8J6kxI<=ONnG zsC3=vNm5ymkY#pNW}pWufDa|TQO}GJzUa3r-fWu$t#ZGQwY*$ul2&LNiuj~6@8(B9 zUJPgo6M_#x`j0^@V}qT}3Pi9`8*VuPN3qp9X}tp`g3F4aOO*OL+z%Pz|7Da(Z%V;f z?eB_R+rgK-^-M6F1XV+s62a6M)*Sg6_`h~aAG*1@NG$5j5~u-MwOUsaEF`EWBqZu9E}wzU)01^*^)PDtKj^s z2!qZe#~IWwZkzH_7Z~t9K9%A1EB=sesmP`sw7CMNhzPb7r&`avT>g1d>H zop)(F)+pN*lv;nDRX8OSr4a{;6u0IIj}R}>%BRX4m_q>;By(S=!Sz-{g`ezD{kIM+n)`o0_E>OIUMoqv?jTqFD76oj0q z6fKfNU`|R8Bw+7*U;^RlfeT3 zG>YrKcrhqxvJ}j&+%;#fsT{QNkDz<2nis?}95Ny(v$G=onwn+17zoR)V(v44i--Z= zB70Tt(J$5`l{=DX0wEM_vm1UAMsT3aRAHIX#i}=B7D8Xqm)k+^Pz(f#EVe7&&oS0@ zbuQHt(u-|3CQ`+YH#s&2eCv9(H4TllcfoyyLCQ>oBAs1InDy%7 zq9N{NDUQtUFvw2wvg!8qSF0gpf0!4a4c?-^zx_AwS<-mDJbxM?_A`GeIEG`)Be( zl(fR1^$?i`S`!R@tu_f<&e%oaZi^-@xsM{0`{sn zhdZ}HcvXqbIvu28Rwy}8KrD&XBCUt{05Hu~jF2CckjJ@2BUA+mp$Ag`cnwD-kR1kz z-mwTshqoS@`@4Vx{_hPa;_9alr<}~a34O23cjs0^rEv-eetgEuodi$2>?!cql1#hs4 zDe4+B)J7D;6I23I(~&nWwtT=#xhB7&wEG;Bk%K|I`D5i5RX`G+2E`L&s`)eUBIl4s zQQ3Fu4sE>J$U*?pi?xkhH3&t$v!sMh{#1L#7UsVr8YG1z<^5;moxJ;pJ9=tsacla1JNysLf+0`fTNq zwrD4P|A72QI%aIi+2T4gaA1Ot`baRProDT&xfe1% zdxaXsnCv*mH`w*;57eAv#h~fcL2E-5XS+u!`W^=C9tj?FeI}!_IiRS6%CAL&8}v>{ z0Sjc9rB!xNdfyMiy-AXKzc^A-p7fGKc4{6-x?`h$azwTp*S4)D@cFA!eT$CG^2ihl zaG?$TG~uk1BK^lKxF~Svdn9qL-j4uYq84iK*uqVeu7EcHR{`E|hpoA}qb{h8>|2WPy z`>wY)^ki}tPc+$peAb?(dJM8}I-*v?y$rZYb)Y>aiF8lBBcQ90aO!&y?u3+TChx&J zKLerQwjVoW5lRtNqbtna(~$?SVc1;|KP53psn>Eu8cXjiA%lh~_3^~LxlJ)02Z#=y zyu)&nfe1LJuUZ9QM6yW!8KnPvwev#ClszkiQ28(t%FZoAa zY~ehI+bKNdIQjNw5lZ%R9z@G{;w1g&Or_7gJQvPxu>O}$AH9{$R=ueuJ4ajJugLoh`U06 zzL~D{ZZrx!xoHJM&t09m8Ug_?VPI6UVorl~oY44)e3U{M$C01>V~Hg?2&$*r^2n8> zILD&Nti<)?RYfYibL@2*;10~vs$MvPcsx?8Eb?fTTyuqxEe);RTf@_Gq!agn#e4a| z)6%8~(j$CSOev03yMb~K39f?^3Y)({U)9c|w#+8-iPNYl*>LI)GNW~&mah|c8&hu~ zs4CD1j?=)FE|}EF(=MbztSsu5tiJFNx`(xJh`FUNQ0NL~aY3!cMjL2V6|c_C(h)Qs z4|YJi!VLFdB9uOC{k#%#&sPwl@4BTw$+w{w(70rwiZ-#T5ybX=Yaiw z`jmBI^Bu<0Z-f5w;r zYm!1-kaV|>j98e*HX+N7SVOx?#t(A#h9i71#pMv8kMZXRrLhQK!^p_Wyv)BdVYK{ZfE50GLM`4 zB!npnc%f!tPHHlB2YpGsSsgN@mYQw5Bn{@j`t~ zxh4Xc)c+fVY8wF`^XHeDMW$|&Hk%sF07<={E|a^49Q}x6ceFjLWSRK#j%>ai1$}qn zM)y9aJLOSE@&hjcDz0J~h$Yiz`u>x^u^QFSsKKYx3-*g!k-ih-a$X6u4FGU66#$^+ z9P9$ZCRuMK%*e1&<>m3}Q++Gg4!s-ZkZT z8Ca?uVLMso(8BOwF>>+XLIRgb4vky~696zH=5?^0XCjBcz2YnR5T|3;?Pb2tm|n7! zvwZ=uat$$@%C8C5OQ4w7b*Xb?Ez&D^uOSt0xgqeyynF^uRx}A@0ZR$$p|Rr!UP7%! zeprq*4stbeLaxaJIHI>JW8?vg%5}@YlzK%p0E!Eb^RNX?uru_l}3Oar_z0 z&AT!tpnSk$I2BxPNoFiO>zDuJi9gBd=Jm*2wm~J$?27bfdz{j7smdX2tED90f%7}| zeg8|czWTAo9A@!X%}YZe;Ti`Sx186?6H#wean(as>y6_hY&uwA#404C`gzFUHL)|u!(LIJy&e&O{9U4V8tnWaoUhMcs|FdOl{y+2-yM| zrT)PdOZOl#f2z0!p2{Y1@|eUoHI9>5hR|`kRMH?TWQ(-ETDnD34Gzo8Oe}>O+T2B z1pC!5IXo>-YL}wU^u$S!iblHC14UeqHlMsnC_?R_nH4ga#Yhi}Ibw%SZbdFd!FFRa z|I}XzqVSn4{X9q;km)d1y@ZK3Kk`3*VdI4`jTm%qKKo-8*ApSGTRYAQ2S zcfR2BGTNz@?vgg{^RRY#@hB!3_O1yDYiDY#8gVpi)l)Py@=Y{b;ujj=$8uQh9rO4| zQ{C?-RU#|Hi1rK#$ap}3F;Y|-tOxk9BNBIG2V?n^^ulfUpsC?gmGx6IpTRDXw+L}j z_ZBzBm2p}4{oR_~n8qVj&8BZF%eHwdmfez#0C=@{o#QZ_;_^PL#0BT0_d?NLR;?>u z&^6I(=~Xyl70P$vRuDu@cb!tJVi^1ut#mDUwdBP69=vOvkDV8(X?fQkStwC`_^c&4 zQ%e8W+sTx3(dkX3;NYcgoK0Cx1}@83KDW$&7mPdcnaR5zo2E!hf9kgsIwNfvJA*%I zsU8TA8_4)hJ{tXC7ii)_YlG`qy$CWEC+~VC9Wh=eu)6OY@(Q`pTbuK_d*{gM*az-N z;FySyd+Te&$0rH#k%2D<)lj+mO`0Q!O>l-uyCbtYZSDjWYr3oR9BycEC$b4vmZIN0I4}O|KKgF$e%P6Z@vr*N#klI zRo+wDZ~wph(XoCPcYqc}Dw!E$-l3z4u`k~;uDa(x4{O5ZCMKFXizn{j#Q;=wV+>9c zQry1nn@1N1Hp}D#Ya;i8i{T`b`4SJ|t}M-ft*uZAa6|lSSh;2cE@KUvA}_`LB2p}7 z_U|t~j-SN@`7~u7IZT$8N;*b!1yi0^`o|wW?a{=EQ-Nwn`4Bk!sSqRQ+w2XY4Dh z<*`tJvSm7;pRHLpDvKKDZ3LW=oH9Wc%JT++*mr@EDUEU(MUv1sUXkeXe(yPQl^0Y6 z{`%u1$suzQ=?$H8*1WDu<*A z>41JWHX*-JXSE`^bDyW4HGT^!90V8=mK}l}Vu!1nsV;6QwJ)y$hWa*2b#(z_ z|HKcY=RM+j9~atG3R;JQ1EUWl!s-V{@%(Swl9r<#hD@TYF-U&v2rnTc&2(6}W!)E- zfSWmc!OVD_r0X06Z?AYlwx?+#*D2-F>h6lkTP-@W%5TY3Lpqt_O`}FK5gasfLU!lX z!>l(1)dfL|T+O%(-WUQvrsG759s`WJkft{lK1806^Y5lVSh0Z1gxZ)*a7VZK0g9)9 zT_FisuE$`Oox8W`LYZQ~Th$^zzpIKkQDu>gk0aH@(IFEyJ!|nM^FvG09pP^l<6(R0 z+EHvWi4!9jNy@>fBJJR$QYT{tcVmasnReEU>wFOrn1 z=4L;}j?#w>wmP1iUG)A0!w{++@{WkFB@e_tigX7}uhv$OLBv_qPh)SmUjz8pweI)K z+g3&d&=kA119;R-a=7XbEz;>K6q$FeU_+f{nLGX~mOcdxWr5QQ$8%m&wj_=y-NOim zQ4ct}brlf5_eh(MVxC@XJFhw_7M)}C^P$fCSNxx1wNjjFL9bDr2r=&0!Pp@M6sMh2 zQLqz;FCQY763SBeW_C4x6#%UpOp~%KGhCigLzI^j&rwPgn0xV|KSH~<;79)A=%s7@ zmu-fLBrU6nv%@c7YlNpJ$A7NSM9^ug0#t~>r%p*Fpf((VEjpa}D<*-h4oeJ?qD^YM zi%g$Id45cjouzfF)`^sJ!zgJK>TQdM)n&_%j@ z^KUDm%i+3#GA$^7=yF82xt6D8ILY%$awH1ryv!p&I68OzcD(=fSyAf#*3Z=TdX6rq zj?fM2Q7HWJ+c?pkJZyDnY6eqp!^sD)J>Q8l6L5=ff9S!b+pxOYGj%{|A7JQ@FNgUk zP4G7&5u(~S9KY`-la9sZl228h4Sd* z^)!(#jn%5s|V7 zWxt$zsH*ka0s7V0ba@kn<>L!TUZoQ}1jv;6%27SshPf*oCsXItf1*cTV2Bmrem|AQE17Nk$l)S{l;~>UWUNjw(O9E@ zJIXpsEZ=A@1?L!Z?6TmW4~wzuOTAXrtm#cy&-m#jgymLJ-KL;@$Cgk=sns+V>V-~B zZ6Q<+lY=6xtQ%4g_74=adD850>zB)an_Ey@jveYGL`X%mG&EJ+qbgA9iyKoXH*%FQ z3pdVyH7g8{kICYbxN=g?*FR6$vlRo?F;k6+4`Z(}(7Cv+HlbVOiW-oi+g5hyAn*lZ>lgI`i_Ei~O z9?76Oq^DA5S|X^dsczk3D*@elpgH%QbIVSwgLcWE)tZ2mB{^bMiEWf?Fr<*T%)7pR zXW~`Q*I5L8c;_@58ZAAFaO2y2(2kRtmlY z_FTK%qjno8`^{*Z^ajC*uXbS-VezCZA8`kK(1du&#fg0QENqJEO4WbD8ZjNV!s4sT zM4iHgsX1;Gga&T26eu**)}wg|0A)~Q5fr09G;%SoS&dn4ZsC2OjMXd_ub z6ZPen>C)ksnY|8@n~2cqr?H?<>OlX(72?NWD&1AEVS;@pYXW7%rtUs-hVgu>THa&s z81XflBN1Lz%AtcGBK0os1{q6ffCS4YS22Kfrnc(ne`ewW4rMD>W_SCSWVM#a;=k=5 zq`XSXK2czYtOh6Oy9~4L+uWPvvKlI~3@pOji36dR7m^dK*1BfGwXx=?8J?d_m(5Nv zc~a^Hh!88+6Q5U~hF7pyVbj;6{HiBka*=Ud*sQ+Xi(xcC`Y|K(7uE1=P062doRmSF zx@r%6;IF&MHQgFg4L5}SNUge&L5ELh(Yxwxn) z@#Q7;N#29Ep@n8|Uflb?{OB_{QzEfM(iH3+N?XkEzM!E5vGf<)ie;ONY*Cvm7sIPk zQ{w`!#fJeF z-uI>Zkl@$@PrhhR8Z8YeANUBk@m1f^M5V&eA7ke)+tTY zPeGqA->Y`Wk}92doV-sLHH$7&`9TEHNKBche`uB;)IXuL<16$aabp=Ca)wvMS@Pg3 z1Bv^{IC%hiP`4eQC&W%K0 zk>v_01sHP1)Wyso%*G?w$FnJRywgH=r+M@nI~ zS9e7Xw-7k7A%Aruuhot53Hq|m;F|2LJ(wrZv_zrT@|_%^TWbGkI>&#LrqoC)kPU82 z2@tQ%Ll2$Z)Ct$pSx#$|D1qOY^!&~=1fwSGWdof$Ags1f(0&8_d9_<3&7cUjZe~v3 z;d0&?qy#=0UEH>Vw0d7F((Q^;KqocJdV9{n#3{97R6a_glW_dqp&e4Q1mS%nZ=Yrc z_fSZR^!*I}XKMJ?_TAqk#&270G8-L!?4#7JwETNS>7Wz&5{8-pzNjL))&+Ue{FA#Ew|XL^^P^0yRo*78>(nU!Z%VJP{4!=KJ9*s>_ zgw<$5o7LbqZpop}<;eIQ)RMw+QIti4p4p-aob#;@$!D7aljeiHx~u=#Y|?S9bbsm@ zQQGZ1w};Pc(Z$E{9Gj0_m<>3IQG=1Sxae>G@niIjD_|>$eswm`mhm@J5!;=u&psQ; zgfZVzCjB6~Y81R4PZwUym1C3F?0YY&xw7@##1YfUVSl(9iF36K2)#dPIf|F2-52Xf zWI~6(LVZ?l>YC8@M1vfL6UK?M(@b>k9RF;h!_z9r)HNp;OTR#IK^4b!2AA%@C+kc} z3=ovQ!GT$2vS>bDK1*Oo++O;}FHiuD0i-^eg$b4*PUyQ53u=b&IPMW65Km5S1CQQ9X1G2rz|vYdO50#a{Q_$IBi$R)3TXs$mym3Lj1A$FR#E)$lCEf{I=T=Z} zBZ}i|&h?Jle&6SO@9e+mj+A(JSJ|W6tWis(b8zLKYh1u-%DN4Nonx+5f8A`_IZ zQ}`qA*61_bx;Cw+7tl`GSRpYH*U>yMzoOcN(_+^ekdI38D#F6tAtK&q1pwmyOm<1>B9XuI`H?Z0N;|GYP2^(sWN1lDQ zCRG!&3sWzv{{jw?I9MlFFZf@7Z~tLASmtvL63^2#t9PSo!guezIq8FG>(ob;fa?}L z*vdKa^78p|t_Be~!Qr%bC!1_(F>qf6p3HU!_n~091?)(%wtN1eBY!9dg;mHfZ?1r= z)`szv5{*rcqBvbv8efxx4YPMb+CUPW%G?c+UVFG-;v}Mbe|_J_R8L^e!40S&v00e+k1h4%40liTByRq2$Z`d6F>4# zZI+$m-Vk9KGAM&f>bxCQN~o;GV5U}Nd^9HXlM^eKYv_Dg;OB^cr8_^Bg5w-UhMS&4 zhZ_MTj^iff0zB|M82zV-4Two?Wm`^HRgcxpEkcHwGO11wvV&({R;>1B1Y=fC>6kx zE{-V^U?5_0rx`Q?^THCaXb-1WlP{1ig7ks}%xdH-2c4izn%yjtZ?E3NLzT*jjmC{% z8Mjr*TXu=4No?aK+cO>w;TS=a23G;49Zw!Zt;*&)OJG?NQH01bcvp>7sCY$Uh`U_K02fEyO?Vour=|G)k;7<;GEPc)bt zXkP_d7k<~{%x!y~mZAt>T5cd*9`4#UKFug(9BE<~k;W@udwONv%Omc6Q0jH2OBCG~ zWzViHZq=)lD+$Yf;v#^p}bu<5<9xeTI zMtg%MzcYX**lD!FnG8Ayj|O;$8cOhljawWOvZsUgg9gke7f{6e^rD@?+mf*{u4b<| z+CF56o>{1_`_}Z1TF0y+wv+$qx{;QD5V|6R1`CV)X~tcsEX{xo>> zUE;m3Lo{0Xo-%(_v9g1sR;b9{5^81!j=``tq!7Rga&=Fe{MzWFo}-!d`2IAIh;x%%w|v57kvL>#q)q-;03JGOFtc>Guq&eC2cnt*mFEy`q)+ zuwP!XMjJfJje43_iZ8aHu1KhTAxk@!%X9pSPsIi1H^ID)AH*cA_~JXgI+*d@q;(qS z;s7=TR)Dij^cHj$ts3BbT(J09C>v$K3=Xku+o4(YxKRLGBYVU6rMZ64=^kg(_YYDT z{jThp1y~i~@#@M~3G?916>dZ0k9ex53A3ZtcoZq6ZW|Nhpy|2mv_6i>XdlFLp5uj)ykhi65FkxeTX5 z=xw$5CZ@kQ=`I{-kay<)LlY(NaH%|6iV~vUvfasOZ!0c62K16sf%A1F5{@iRSkUfs z8-J(o%Arc)=N*Ub=xnpTSU#hl4^ln(f0N0>#ZiEM>CwpS6BWf z2Hd$~qLA&~tq2VnGlj#U20E%CCj&(uR-;F$1oJ+^Hm7WJZVoj-FmLD5{4cc242<?i3|vpZ#UZz@dwH zCD`~v9Jl6#z(Rc&#V`$n%Av@5l(gE8Kg5ygI)yTbZHL>eLzU19(@+ z!fR{Dwl^g%8wEU@eT3U6=RvxH>A9~}4({DC=y%UR>j+Ss;>hh==KBPtXZ9Pr{eOww z{Tw;z7NZ8&)W0aD)qRa(nN~83YD+v|sS621-2v*-_H0=2)pRpLr8ShqH1f;+Se;0K}G+F=qhwNBV;BK zd>4nwO9#^N1!vauKuk9<9q_Hk{U-N11W|SiaY=6rUn)b zo*_%#m?6G+C+`{xDy|J18XiUXTwyBB%P3bt+hVI}cVeD&W}%PU>#3|B4XU{-&4cXU zEu^o=fH_!jA07N!xv41GX)8~*JbRVt10ku2igNv3UaR8SD2?&lczvwWH&o_=HS?@M zYeVNKQPLZZ2`*od=9}QmEpDVFwAf+HY6usT)K8k@i!z_yI}F}vRtI_j0CGoV$CZ}A zCEGXL?LK~|Ik`0riy#TtL#W^lOTUj#+b?ZZsj+LkYcqHUCmfOSRsCT*W=Hi5*9yws zsBXRlAgzSVi7OQO`(cjGt$JUS$E_W?UXulbrfaJZxCEs|QpnL@2XupIMUv=_h^iSF z_91M`c@5DnRDZWrFnIA@bR7E*5k9+TIB9*jlO>IV(lAn|LwpM!P*aZP(m#mt9rBp< z>~virk|P6>BSuy#hWk(;_B(l9Y~zxyd`{S{dpW(dk5wm)Pv^>be0*Z55C5A7YQYkI zlr6PdOd$QsZ0bn4y>p6iP*n)M+pDb@C>$q4!U%naB~BBcsZ_DhwaXei&UTHI;kq*9 z-bUZ^hBpnQNhxJ2mNSfbt`l7Hw;w?bI`NF$w7R2`SkPB&RZKetUK5=uSx+SYXmL$> za70mDu^37@+#K~~8;#ijSPjnDnyhgJ^oWupexAZLuNHrycZb#V3r;aPsDDGk<;F!R z$NZ@vqB`Vh?wb_D&VL^N=d3ZMp?8S0cRIYcoUIf!m?R-jwuS}8k^#bgFb>;6vP?T@ zwsMf3xA^>T1YT1pP%bzgefDX=n2`-x2Bru+ExLjb&|w3ekni`gFpY3$ag_OX+u@f3 zu8KO947rX02bnO@i+Vs(mk?x+|l zHj|=FWOU=jGdX8^B{x1?li$1AE7%WfKO#Z2U14936YRXWFo|t8+uVQj(GqspHL=k> zWAcUC=p2)_IbjMIZj_XF+3j$#6a32@=1*lU8M}70yx6O(8u1>+g+9oqc4Cdz*amLc zDQqXa4U`1W;s=@8kAMfAHg&epS#ENoF^`)!s4(fq&Y!7b4Pfe;YSgmtA>ep7Ry|}$ z%Bm9){rJMPW)B!0g}?gJtk8P+`<|$-+?U@S605|3abgFg(6ReGTn(}Tvdkz`Gr=fi z$pXXvOa3@@k|Ye&+E&-QLNHv(iBDjZyjIXMpJ5GU^C_~VV3>Nc&`ishP#%)ldbc(K zjr+dr6QA``WB;mul~Opq29s}=hj94L$U3g9LQpld5X)c73{+IbB&xksZTS;%L>VMb zR2m2!#gl=s>&|$H5|bq!%rtNy3}uRVMrwxVNm7ydJRw^TMf=RhpCSbI%RE{BKmgDBD~9{ z%@Je13?C(ysk&k8cv(P1;L=qNd>{H=U7}?cnwRxk1sx?{NgzZAg=AJj=L3KjZH?D{ zIO$Ge(BwZeN(hixpQc+ZEcfLohTgQBcS9ta7sITYX&$^>v*MSLQ%b6kbe)m|>0;;5 z;u!J$u#v>0@-!qEtseE6@$0HY&l+S>T_aMbU+8|;oI*?3_gPSVdDL|p*yHs7U=`?d z^SpVoB>!7&bTUcQ&zhFOWNetzqv;Lqfx4?M39f<=^I6clB5SfLo&2xafQUu!Q;gnS zpS9W|DcK z6VXBs>i#|Zp>Ag>6rFT6^!YIY^HuTIxBV3adA)TrB26jMQS?@+yO4(1V(YvEtb2TK zyO3g6=0D|^EMD8sW?G2nJ3$}D)y7P`v-;33H;*BHt}e*wr59qjW+Mh{#*ha@AA!uy z)tHl#aaT=&WfIs_GwKh+F1d>MfP$KlHlqaThmyy-Xj-gwc44*LN>T8XKkTM`F4 zJ^MLfI0|S)`!jpDEOQl6ZG!KQYgWw;)vZg6-uVrkG$Dk4AMwJX=lKk|3*(%J_c|_? zRW|DCKB_O)Os4P~J3)LFTN9b!0!leD^X89DH# zL{a-p{~;KflQPlly^C9vk8RF=Z?WmB0od3^6p&?YE@siV*2C#P4g6VN8DDdQc!Ufd zG_-(o(#9Czbe(~O-@&ec&lG0diy(+x@krcEmWSMtGA>S71%k9b)uC^ajHz(3*t#TM z=JQQ2eleWksO30cy^yPw8S06Z{6>(pneIz$Q$$d<($aj&sIpTYaZ}2IyJa`M0X92^ z$8o%Lm{W;3{Y2l9G09s@2fn_D&P+jful@yNpY?2QWalR^Ye9yCk{XFs38NQjnk;wGCudAIWY;54qZ zz&ZCq^)-6)Rqz?+f3|TlTQt$@K>x_6Uev?H;~25+vL?I0dMAanHbnIJsyvK)6i0Q17_1x<+O$g=}+?iXW9XXS=lYFJgL4umSZ2^Txz5Xi_aZsaVUGSsR2BCJ(5f zQ6x08@U0Hngbe9T#pdqsx~=5&k(xE49ELPug2+dp{CDGQML(*@+U!~t;XCprKwn3G zzmr9a$B49lShD-M0;*%v7S(?n5;k~lk>LU8B!emTm!xE=XswW%?$R9{D7eXHkmgdU zWZ>BbCV+bp%xB@m#_l}WUM5H=2boLKgIeXg($zCFJ*5k!gyq1Ns^k5kOgF5KI6yu; zi2y?Xy=?YJwPB{EL-zj&0TkDoirl-n9!>4>aljHWLp^~Cb)$QY}c%L;x6by{#B;|_$`{C{|Z7PW7MN@e6>>N zHtxRwrMNlt(M_!J>(vQ2y!H)Nevlq0T{sX02EeJnAHrdH9|lw0Ni#Z{fgLuT$eg6r zOv1o%DP-t`A=DvY^2ZahJ8f@hR)91JLmT0DbWyYuIJN1fKBUeKg7CED=d4iEr?nTS zFjwxSgiY*>74fR8dEK3DyD3*k6!-%`&xU!Wwg|zF+qhecZ)kGDdG@E2&kz9B+>nH* zIScqb%h1XZw*tN1R}!XcbMmM>)uU<)LWR!Lu`dtAOhc9yrQQbe zoe(fpgAdYHHS{SbIAY?og4-w=#uSe1iW1t8>UJlPZe1mg$LIPVFuQO6ZNe1sUAGHn z_8~;IFCU6xszHD`V*&k+PmOzBlW>ZjNsnwmF>j*hyA%%}8Rcj`hmC@aLZ>@yay_*} z1U_C`P!fFS%t!NyHvMFk(Q)WfDkGpa#3oBE4q2v~c(v&62I2NLSKr<`FsJrzrsH5A zRv8noj_Y8J;pQU{ih!(z%lh=dxp8bG*lJ6-M^=&e^`c}Rrm~TSn~$NJMf$Ml*(mg6 z(2#ea_Ab<@O}O(@M~sIbDf(a;$P758`!W981x_3qCak~3Be+X%+9DXg3^mcc6_+Oe z5&E_fIk`|?r#~u{NB#Yctw&c^g02J(K2$6ym&4{>n8Yo?W3dLk%(gB9qLjCLRg`&{ zL%D+5jGaU!B+a}^5y-^b5jTyM1y8$bY~X1^2EO}@>55r*Dfe|n=n*V7xj=g_?q~^R z{R7gNl@-?jg$}LFTYj?a#CU#S4IGiyVkHPaCL(ZxZl0zx@qPdw{~XqQ(kv(o)~&BX zX*;y%xSqae=+6Co%8ow-Gn->n0*Mhoz_p*!J}hDPB`z)OlF?w^j(VqEp~6bnntMGWm*?F zorO!;gl%knP2>lOcUlM**tnplXVkS%;gfeQU)TTZ#i77vvUt#lvQF%+!t#kKWgoSn zJaBzE@^BQqh{rLt`4|U=Zm*8mkR57?O)Z3=ixsu72gYAINUMKGF{8suAey|SMYr#} z=&onFh{*CwGSAa9#5p5apyJ@I1`Cjd)L|xg7yi_t;Q;wy7R-YNo5*iMdp}d@qA8ZM zV+}qkeDNp7@(gAV8;Ed-)IJZ$+x_W-8#W$?L<9PrLL{}wM-{Q>R$qN`5ZUi3 z=(z4eN{f>#(!uY|osDa2a0v0#Er@$s&M&pyoclR8pIFa!NhyK8i*{;oMkv??6v~Jj zPj)fz%V0?P>6K&4dLZGUIOxbPk6viFFInp|Om&+Mt4XJgN+cv+@9hT+f|CfzI9Cww z=3-V>ZPvRbxrCryrX+^pd}~5%Z0M`*D-NHD806kHDsInj2h65|Pr(;tLIqJ7=&ULi zef|X6k$LQ8&H#_b8(m&sP#5@AU;J_PAeFNVEWDYre18EAh9qh{ZtGykgP{sGMxk&; z{O41(NrEt)+}FL_Y#4r#a-km%K&RlIu@h+vE+Ehy&`p+H(=U#;}Vd$6==`LSqJ74tQ$fuAZxjV2J55}<_3T$9vXe?aEY!SK@3My1Tt zX4d<=`Gx>L14;Ow9C%rjMXtKoW#m#su`#iNKrTvVI9)LxZIb3Xh_v)G$UKWnGn3CL z#s&#=LgV-wK!P@up1$ptl&OUxuaY>@INMB^z+dqcB=kFiWcY~j*(#S3I$!-E4Ft+? z?FO+TFh<1J?2QI@R6e1M{!DZ{@~ra_nS6dF(56eI*;1MLGwz_d+n*cfXND*YXuzhp)Z6^VXtBzlWN1} z82PD>5i-__H#kSC)PAKd&Lq6xSm-ofR6;8xP4&X~pKaf>Et&sh$ISCtT245F;c#|P z)e-VC97rku3)g{(W3j)<*qJqhAd#B`_i92Y+cEx$58{%4^&MK&v`yR*Mu&MH-kFT@ zgBE+den!YudCfP@IJjDLtg+*V`u(v(daoJf`0~Y4{4aFMQ!U$5rNnznLF(Gv-7^rZ{nlApG zdW0UlEUvHM_DPXDdAHs05(b$)cp;)1#Ye%ssx#KJhT4hzbo@}};9S7IxXx5Q5K z3yE3T0;v)Gv95` z!mkbtdCBg;(0&Kso`eC(93(Q@dEUQLc8m4}{4#%0?b>PoZGB{Fq6Q}ZU=JnQzMyK- zS^VuO<^nh4DM|}MY~c*)tn3NEza{0sBeouxtWu{$I6w-b%q%aV=Pa?<`s#cZ(X+gp zhpQ^jrDa*HSN3t;RzMZj8T3CCr7u|&Gs|H#M;^6RnLcLl_j`x!0Y)pMoBi_t?i+}u zNd!*X)_NkD+d{%NHl|?pIw<}Zd;BrmZyotn*roO8j%BBG=dKX6+ZqzrmeO|! z>8z$kG_vZxr!!(r%P<@<06)A|ZLvCdYgH4HZz6XX)qV0;tSHdSnTbX?k4y(%pbjQ9 zkvag-X1!aoV4?9^cZxrrn>vksl_c16O--NRG|+*<0oFT!tfy@f^(m$cG&A5`r3-UA z!X^8_SfTIg%wRTm8ABbi4`lx$PJ!Dv|Mr8Duf#%1_%YKDqRwOM9qt{s7Xuys&%N$7 zAn{o^DhIh0b67FOKilZBbG{$YovAx+azmjVxt$GEo1L<&KEhQ zQ?F%R>aR;+8_ei@eH%C042QokZ&i0^2ZoDEEFCLpwZ21A_)o!#hW>^69W|XbhSQ3*8dkA&EC05n)**D zn!xqse{Kb*YaEScu?&jHjpkQvW|e?eyux8shJULKvkM9l1XGsuBU9Hp!R_r-F0))> ztNIhbe=&qpN@6y_Pk5=pLO4PC)@a?FdWOUEO$2L0jD^1rbD=>Oa85Hb;IkA%Ls<}` zRUb#8$UOT(e6(^6T7I_v)p`zos--Z}>~7~dGpEh4T?w4ubfwmV;(4iuhc4-KWx@1u zc(}tpjx_Nv`&%>c!r=5JxhOc^PQQILhbxrGQyF|@URE=xEqg6DgzPxzt1i6{e%k zW+&J1+a6HYrETU@YTku44(|KLQ0s5Xo>)%Mz`=b1Zt!96nv-aaF@~1bJ`Ry?!N+l7(qddSibw8qqV@EavCs0maxiTpi{$A?Gy zgAGA0Il4O+CX_SIK6ypRR9FA@sS9F^AkSx{L`EqCG9x3l+ybG)uL!`9)V~t=T)5;y zQO$v$oKFnb^E%iE;X|Z{hv1ubMPoH=M29O47KHdEiOyl=nMsJDuczDjjgJ5a;$1#xL{4o#1f2Bzz&|L0oivJkZy8&>;jT|QucH3t2uyu^*nY}1{YCnV#9{=@T z%B3+THA7yPInEO%MY4=uf6vAS{cHyYo*pS%W`Y2}il#%IUj}24Cb>aY;{2BuV^XIT z@4HQ_u50*zY2#dNt-j~4L* z^veAWvJY<>eg|Q_Nf@jvs(Wov{h4+VCDCqs^mpbVVu~;*%=IY(VLf5UwQBXXB~q-< zIR8xO=sE$oY|?*|$?2gKw?VYgmAD;mJYq+fAbN^fX6wV}K?Hh#uV_Ej_KS)WA#LNn zX7Fdn$`Nur-bCrXzEdHyDhWn6x9-&P#Z+|aZi)Q4;^YVzidU9S;vLiffsRWugfRS*7QPvM zOVouX_|1166YRll9=XVgk$hlOy{jdLaAQviVS`)9%fnmsHO=NH6E-Er0d=#BDaexa zEbQyIZs+d!rz{7`DT)?8GVY4El&5w>^xO2(bCnaMm5X|j*T3JhO@t>wdFX*Xr{Se2{G3GKI^U3bUuu!d~p7<+D|Qw12JRL?0-To`H7HZTvkOnDg|U%n+LY1P{@C%#~={{kwFg%{VNFG z{M&zy^JTh$(@trg3_GtKOB=!oozet`LYjy51gr&6tNr^+wLcO17f+Nypp{`iq$LMe zJ5=S~>lpQWjx*X9v@K#6rDOAxbD!QCEUqbo_Q;ZzN;YL{dU7ex($>Qt?ifxZBbFQL zO*!Wvr3Q3B2$%ydBdJd!Xu{!y)$d@ki9VKV0CM;XPT-O8pc@0EeMNlcJavL^YB^PE z8DS|5p9%TXbiKk*WYKeP#Wb^fI_I-hul)77&a6Z9P`S4X@ri5Y>w@NT+gBYl`hiBV zfDfI(m}G@Wq*D$7H(hJx(5mIHDl6fwAlQy6))QR>9|Q{ysTZOZVm%1Pb}3@N|ZlhS%7r^Iiv`4(adw6)lS5ueu3ixvR!G4sTL8 z=+J1ES?|-J7m&89%iA@8Kg4dX8ikBUG^=uU*R|kx>FdE>t6hS5dlb&ePK0Nx-ToIR z?eI3`22cRb0Z%2c+V5xChuajEkVkW2N_dS;Dm{9Ma)YZ)n#}HV16saIH|acWxk|}t zb#hEh2kd0fWWye9w89^sfq))`#G0>|Kc#fjhYSDQXZnGB|5Qb@^k(hdY(GnqGueMt zs$ivXJgKhP77&EsLAfiI(6D>SwZd66@OD(KP-tZbBHlS0Ax*)@v-?W*E|+_@P#AE8 zV!pwI{R4c;++&^<)+B~Eb8yzmwgpIc$QW*DTSDG1=}lK3n$5qz6qTlKsl07%!lZXy zCYgZG&oJFZywO-U(|FWL5txVtA2y(h78U44MJI^<2Ar|cF*J>t(MF-N`p}-Z`uh#O zKdEZHG7ObXXIK5kZE(ALiE%sFym32ug-MjqjEDCh&aq7@BY@_0jJGE&ax~J3tIN-58ifPZp6GrQA*4^*Nbh72V z`kUp2=bkfa6l}56;Yx}xzxOOtITF3Q#9hf=obq*2$7^sV&J zpv9|@qV!NG=)xI+BF^n;BJgmQq>@WcTHYyDMEk2a`QWr&v|M~3p$vFsNtZ-))oR8D z_xYGbZUD*2G9L?V-xC+jXCFSWg>M%=Mu#?@%ibfE@s9{wiD2~d2p`cxHxTnO3H(f$th=0<&y9D+N3BgXu5^J1y94@dALwJ5uM7pI%PPoIK@8?0ILT@lNT zU&_V;=4c(e+(J)AXI-IBW1nz|$CzuEHOT6+eVK(PKk}n4v2!F%44%8?>rBC{lh#MJ zveL;c8c#1(j99_8Ak)1>^f^0LReKv9^03{#7&8=-=XhqOVGYB4aw_BA+^=C6Ovq@^ zy*;+K9@dy4~-+bjZ%Gh4NK z^7fYwgNC>Q^zs=M(73u^jwz zouJN#p0n;?nDViLl{^c1o9Mm|KbdnQayLIj9^=?nGdLE zdmg1!smo-xAI=XN18DxzH11TnSpV)7KQH5q-eDOWJ#&ILex7+n4|1?hh0BK?(rUBS zMEONTD<#^MWE()16KoMGPgTWk4fF7-YcLBAKZFgCJ;YX3;?MVGK(2YZ`a z(hp6GG;E+J^hf6!8iQYY2FVd_f2%0tkR5Yi%fhb4oibf%Fu+0rV>yJnC8mGV@OkMT z6Z+fO@;$L;34eHfMFZ)D;jJkc%*pyr#k+G(TqXsc!Y~;ZLfYm2kb|g{Nu;%g2^?MN z8SB0{0!Z%0FXHygr{r$4@ln1-ms6Q~&~jN;J&wZRaf$FPvo^2T9-V)73x%PeYAFKs zBm!89jjFCV{3lANz9tKt-RknJ^22^VR&q=&YPd_xS0?K;gRHF@Np-|1(-;I0CZJsU zcVqVFdGG6X9KDi8@f{*qEnIZ8z+#q-@jWFQBItLs!WQ zXMKy2A&L!+CUTh9eU4p2gEmO2BzO#+t%AF9-S&6%0A*H!%thW$T6X_MleBRvj5HXk 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 +> Fun fact: `⚛` is HTML entity code for the Atom icon: ⚛ The first screen should show you your main [_Drive_](https://atomicdata.dev/classes/Drive). -You can think of this as your root folder. +You can think of this as the root of the server. It is the resource hosted at the root URL, effectively being the home page of your server. -There's an instruction on the screen about the `/setup` page. -Click this, and you'll get a screen showing an [_Invite_](https://atomicdata.dev/classes/Invite). -Normally, you could `Accept as new user`, but **since you're running on `localhost`, you won't be able to use the newly created Agent on non-local Atomic-Servers**. - -Therefore, it may be best to create an Agent on some _other_ running server, such as the [demo Invite on AtomicData.dev](https://atomicdata.dev/invites/1). -And after that, copy the Secret from the `User settings` panel from AtomicData.dev, go back to your `localhost` version, and press `sign in`. -Paste the Secret, and voila! You're signed in. - -Now, again go to `/setup`. This time, you can `Accept as {user}`. -After clicking, your Agent has gotten `write` rights for the Drive! -You can verify this by hovering over the description field, clicking the edit icon, and making a few changes. -You can also press the menu button (three dots, top left) and press `Data view` to see your agent after the `write` field. -Note that you can now edit every field. -You can also fetch your data now as various formats. - -Try checking out the other features in the menu bar, and check out the `collections`. +In the sidebar you will see a list of resources in the current drive. +At the start these will be: -Again, check out the [README](https://github.com/atomicdata-dev/atomic-server) for more information and guides! +- The setup invite that's used to configure the root agent. +- A resource named `collections`. This is a group of collections that shows collections for all classes in the server, essentially a list of all resources. +- The default ontology. Ontologies are used to define new classes and properties and show to relation between them. -Now, let's create some data. +![The AtomicServer GUI](../assets/ui-guide/ui-guide-fresh-install.avif) -## Creating your first Atomic Data +## Creating an agent +To create data in AtomicServer you'll need an agent. +An agent is like a user account, it signs the changes (commits) you make to data so that others can verify that you made them. +Agents can be used on any AtomicServer as long as they have permission to do so. -Now let's create a [_Table_](https://atomicdata.dev/classes/Table). -A Class represents an abstract concept, such as a `BlogPost` (which we'll do here). -We can do this in a couple of ways: +If your AtomicServer is not reachable from the outside we recommend you create an agent on a public server like [atomicdata.dev](https://atomicdata.dev) as an agent created on a local server can only be used on that server. +The server that hosts your agent cannot do anything on your behalf because your private key is not stored on the server. They can however delete your agent making it unusable. -- Press the `+ icon` button on the left menu (only visible when logged in), and selecting Class -- Opening [Class](https://atomicdata.dev/classes/Class) and pressing `new class` -- Going to the [Classes Collection](https://atomicdata.dev/classes/) and pressing the plus icon +To create an agent on atomicdata.dev you can use the [demo invite](https://atomicdata.dev/invites/1). +If you want to create the agent on your own server you can use the `/setup` invite that was created when you first started the server. -The result is the same: we end up with a form in which we can fill in some details. +Click the "Accept as new user" button and navigate to the User Settings page. +Here you'll find the agent secret. This secret is what you use to login so keep it somewhere safe, like in a password manager. If you lose it you won't be able to recover your account. -Let's add a shortname (singular), and then a description. -After that, we'll add the `required` properties. -This form you're looking at is constructed by using the `required` and `recommended` Properties defined in `Class`. -We can use these same fields to generate our BlogPost resource! -Which fields would be required in a `BlogPost`? -A `name`, and a `description`, probably. +### Setting up the root Agent +Next, we'll set up the root Agent that has write access to the Drive. +If you've chosen to create an Agent on this server using the `/setup` invite, you can skip this step. -So click on the `+ icon` under `requires` and search for these Properties to add them. +Head to the `setup` page by selecting it in the sidebar. +You'll see a button that either says `Accept as ` or `Accept as new user`. +If it says 'as new user`, click on login, paste your secret in the input field and return to the invite page. -Now, we can skip the `recommended` properties, and get right to saving our newly created `BlogPost` class. -So, press save, and now look at what you created. +After clicking the accept button you'll be redirected to the home page and you will have write access to the Drive. +You can verify this by hovering over the description field, clicking the edit icon, and making a few changes. +You can also press the menu button (three dots, top left) and press `Data view` to see your agent after the `write` field. +Note that you can now edit every field. -Notice a couple of things: +The `/setup`-invite can only be used once use and will therefore not work anymore. +If you want to re-enable the invite to change the root agent you can start AtomicServer with the `--initialize` flag. -- Your Class has its own URL. -- It has a `parent`, shown in the top of the screen. This has impact on the visibility and rights of your Resource. We'll get to that [later in the documentation](../hierarchy.md). +## Creating your first Atomic Data -Now, go to the navigation bar, which is by default at the bottom of the window. Use its context menu to open the `Data View`. -This view gives you some more insight into your newly created data, and various ways in which you can serialize it. +Now that everything is up and running you can start creating some resources. +To create a new resource, click the + button in the sidebar. +You will be presented with a list of resource types to choose from like Tables, Folders, Documents etc. +You can also create your own types by using ontologies. diff --git a/docs/src/atomicserver/gui/tables.md b/docs/src/atomicserver/gui/tables.md new file mode 100644 index 000000000..2468d52f0 --- /dev/null +++ b/docs/src/atomicserver/gui/tables.md @@ -0,0 +1,31 @@ +# Tables + +Tables are a way to create and group large amounts of structured data. + +![Table](../../assets/ui-guide/gui-tables-example.avif) + +Tables consist of rows of resources that share the same parent and class. +The properties of that class are represented as columns in the table. +This means that each column is type-safe, a number column can not contain text data for example. + +## Creating a table + +To create a table, click the "+" button in the sidebar or a folder and select "Table". +A dialog will appear prompting you to enter a name. +This name will be used as the title of the table as well as the name for the underlying class of the rows. +This new class will already have a `name` property. Using the `name` property as titles on your resources is a best practice as it helps with compatibility between other tools and makes your resources findable by AtomicServer's search functionality. +If you do not want to use the `name` property, you can remove it by clicking on the three dots in the column header and selecting "Remove". + +While creating a new table you can also choose to use an existing class by selecting "Use existing class" in the dialog and selecting the desired class from the dropdown. + +Classes created by tables are automatically added to the default ontology of the drive. Same goes for the columns of the table. +If you chose to use an existing class, any columns created will be added to the ontology containing that class. + +## Features + +- **Rearange columns**: You can drag and drop columns to rearrange them. +- **Resize columns**: You can resize columns by dragging the edges of the column header. +- **Sort rows**: Click on a column header to sort the rows by that column. +- **Fast keyboard navigation**: Use the arrow keys to navigate the table with hotkeys similar to Excel. +- **Copy & paste multiple cells**: You can copy and paste multiple cells by selecting them and using `Ctrl/Cmd + C` and `Ctrl/Cmd + V`. Pasting also works across different tables and even different applications that support HTML Table data (Most spreadsheet applications). +- **Export data to CSV**: You can export the data of a table to a CSV file by clicking the "Export" button in the top right. diff --git a/docs/src/atomicserver/installation.md b/docs/src/atomicserver/installation.md index aafbf7de6..9b133657f 100644 --- a/docs/src/atomicserver/installation.md +++ b/docs/src/atomicserver/installation.md @@ -8,8 +8,7 @@ You can run AtomicServer in different ways: 3. Using [Cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html) from crates.io: `cargo install atomic-server` 4. Manually from source -When you're running AtomicServer, go to [Initial setup and configuration](#Initial-setup-and-configuration). -If you want to run this locally as a developer / contributor, check out [the Contributors guide](https://github.com/atomicdata-dev/atomic-server/blob/develop/CONTRIBUTING.md). +If you want to run AtomicServer locally as a developer / contributor, check out [the Contributors guide](https://github.com/atomicdata-dev/atomic-server/blob/develop/CONTRIBUTING.md). ## 1. Run using docker @@ -59,7 +58,7 @@ sudo apt-get install -y build-essential pkg-config libssl-dev --fix-missing - The server loads the `.env` from the current path by default. Create a `.env` file from the default template in your current directory with `atomic-server generate-dotenv` - After running the server, check the logs and take note of the `Agent Subject` and `Private key`. You should use these in the [`atomic-cli`](https://crates.io/crates/atomic-cli) and [atomic-data-browser](https://github.com/atomicdata-dev/atomic-data-browser) clients for authorization. - A directory is made: `~/.config/atomic`, which stores your newly created Agent keys, the HTTPS certificates other configuration. Depending on your OS, the actual data is stored in different locations. See use the `show-config` command to find out where, if you need the files. -- Visit `http://localhost:9883/setup` to **register your first (admin) user**. You can use an existing Agent, or create a new one. Note that if you create a `localhost` agent, it cannot be used on the web (since, well, it's local). +- Visit `http://localhost:9883/setup` to **register your first (admin) user**. You can use an existing Agent, or create a new one. Note that if you create a `localhost` agent, it cannot be used on the web (since, well, it's local). More info and steps in [getting started with the GUI](gui.md). ## Running using a tunneling service (easy mode)