From 75e91c4a3b3893ac3d97b5689682bcca5262aac9 Mon Sep 17 00:00:00 2001 From: Malte Modrow Date: Thu, 15 Feb 2024 12:23:38 +0100 Subject: [PATCH] feat: add example for drawing tools (#220) --- examples/drawing/README.md | 36 +++ examples/drawing/index.html | 31 +++ examples/drawing/package.json | 14 ++ examples/drawing/src/app.tsx | 48 ++++ examples/drawing/src/control-panel.tsx | 29 +++ examples/drawing/src/types.ts | 79 +++++++ examples/drawing/src/undo-redo-control.tsx | 60 +++++ examples/drawing/src/undo-redo.ts | 231 +++++++++++++++++++ examples/drawing/src/use-drawing-manager.tsx | 55 +++++ examples/drawing/vite.config.js | 17 ++ examples/examples.css | 39 ++++ website/src/examples-sidebar.js | 1 + website/src/examples/drawing.mdx | 6 + website/static/images/examples/drawing.jpg | Bin 0 -> 46887 bytes 14 files changed, 646 insertions(+) create mode 100644 examples/drawing/README.md create mode 100644 examples/drawing/index.html create mode 100644 examples/drawing/package.json create mode 100644 examples/drawing/src/app.tsx create mode 100644 examples/drawing/src/control-panel.tsx create mode 100644 examples/drawing/src/types.ts create mode 100644 examples/drawing/src/undo-redo-control.tsx create mode 100644 examples/drawing/src/undo-redo.ts create mode 100644 examples/drawing/src/use-drawing-manager.tsx create mode 100644 examples/drawing/vite.config.js create mode 100644 website/src/examples/drawing.mdx create mode 100644 website/static/images/examples/drawing.jpg diff --git a/examples/drawing/README.md b/examples/drawing/README.md new file mode 100644 index 00000000..cb4492ba --- /dev/null +++ b/examples/drawing/README.md @@ -0,0 +1,36 @@ +# Drawing Tools Example + +This example shows how to use the [google.maps.drawing.DrawingManager][drawing-manager] to draw shapes or markers on the map. In addition the example implements an undo/redo flow for the drawing tools. If you only want to add the the drawing tools to your map take a look at the `use-drawing-manager` hook. + +## Google Maps API key + +This example does not come with an API key. Running the examples locally requires a valid API key for the Google Maps Platform. +See [the official documentation][get-api-key] on how to create and configure your own key. + +The API key has to be provided via an environment variable `GOOGLE_MAPS_API_KEY`. This can be done by creating a +file named `.env` in the example directory with the following content: + +```shell title=".env" +GOOGLE_MAPS_API_KEY="" +``` + +If you are on the CodeSandbox playground you can also choose to [provide the API key like this](https://codesandbox.io/docs/learn/environment/secrets) + +## Development + +Go into the example-directory and run + +```shell +npm install +``` + +To start the example with the local library run + +```shell +npm run start-local +``` + +The regular `npm start` task is only used for the standalone versions of the example (CodeSandbox for example) + +[get-api-key]: https://developers.google.com/maps/documentation/javascript/get-api-key +[drawing-manager]: https://developers.google.com/maps/documentation/javascript/drawinglayer diff --git a/examples/drawing/index.html b/examples/drawing/index.html new file mode 100644 index 00000000..aa5ee433 --- /dev/null +++ b/examples/drawing/index.html @@ -0,0 +1,31 @@ + + + + + + Drawing Tools Example + + + + +
+ + + diff --git a/examples/drawing/package.json b/examples/drawing/package.json new file mode 100644 index 00000000..8f60b00f --- /dev/null +++ b/examples/drawing/package.json @@ -0,0 +1,14 @@ +{ + "type": "module", + "dependencies": { + "@vis.gl/react-google-maps": "*", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "vite": "^5.0.4" + }, + "scripts": { + "start": "vite", + "start-local": "vite --config ../vite.config.local.js", + "build": "vite build" + } +} diff --git a/examples/drawing/src/app.tsx b/examples/drawing/src/app.tsx new file mode 100644 index 00000000..f3aa18d8 --- /dev/null +++ b/examples/drawing/src/app.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import {createRoot} from 'react-dom/client'; +import { + APIProvider, + ControlPosition, + Map, + MapControl +} from '@vis.gl/react-google-maps'; + +import {UndoRedoControl} from './undo-redo-control'; +import {useDrawingManager} from './use-drawing-manager'; +import ControlPanel from './control-panel'; + +const API_KEY = + globalThis.GOOGLE_MAPS_API_KEY ?? (process.env.GOOGLE_MAPS_API_KEY as string); + +const App = () => { + const drawingManager = useDrawingManager(); + + return ( + <> + + + + + + + + + ); +}; + +export default App; + +export function renderToDom(container: HTMLElement) { + const root = createRoot(container); + + root.render( + + + + ); +} diff --git a/examples/drawing/src/control-panel.tsx b/examples/drawing/src/control-panel.tsx new file mode 100644 index 00000000..030aa048 --- /dev/null +++ b/examples/drawing/src/control-panel.tsx @@ -0,0 +1,29 @@ +import * as React from 'react'; + +function ControlPanel() { + return ( +
+

Drawing Tools Example

+

+ Shows how to use the Google Maps drawing tools and implements an + undo/redo flow to show how to integrate the drawing manager and its + events into the state of a react-application. +

+ +
+ ); +} + +export default React.memo(ControlPanel); diff --git a/examples/drawing/src/types.ts b/examples/drawing/src/types.ts new file mode 100644 index 00000000..f61c6be4 --- /dev/null +++ b/examples/drawing/src/types.ts @@ -0,0 +1,79 @@ +export type OverlayGeometry = + | google.maps.Marker + | google.maps.Polygon + | google.maps.Polyline + | google.maps.Rectangle + | google.maps.Circle; + +export interface DrawResult { + type: google.maps.drawing.OverlayType; + overlay: OverlayGeometry; +} + +export interface Snapshot { + radius?: number; + center?: google.maps.LatLngLiteral; + position?: google.maps.LatLngLiteral; + path?: Array; + bounds?: google.maps.LatLngBoundsLiteral; +} + +export interface Overlay { + type: google.maps.drawing.OverlayType; + geometry: OverlayGeometry; + snapshot: Snapshot; +} + +export interface State { + past: Array>; + now: Array; + future: Array>; +} + +export enum DrawingActionKind { + SET_OVERLAY = 'SET_OVERLAY', + UPDATE_OVERLAYS = 'UPDATE_OVERLAYS', + UNDO = 'UNDO', + REDO = 'REDO' +} + +export interface ActionWithTypeOnly { + type: Exclude; +} + +export interface SetOverlayAction { + type: DrawingActionKind.SET_OVERLAY; + payload: DrawResult; +} + +export type Action = ActionWithTypeOnly | SetOverlayAction; + +export function isCircle( + overlay: OverlayGeometry +): overlay is google.maps.Circle { + return (overlay as google.maps.Circle).getCenter !== undefined; +} + +export function isMarker( + overlay: OverlayGeometry +): overlay is google.maps.Marker { + return (overlay as google.maps.Marker).getPosition !== undefined; +} + +export function isPolygon( + overlay: OverlayGeometry +): overlay is google.maps.Polygon { + return (overlay as google.maps.Polygon).getPath !== undefined; +} + +export function isPolyline( + overlay: OverlayGeometry +): overlay is google.maps.Polyline { + return (overlay as google.maps.Polyline).getPath !== undefined; +} + +export function isRectangle( + overlay: OverlayGeometry +): overlay is google.maps.Rectangle { + return (overlay as google.maps.Rectangle).getBounds !== undefined; +} diff --git a/examples/drawing/src/undo-redo-control.tsx b/examples/drawing/src/undo-redo-control.tsx new file mode 100644 index 00000000..b6d92103 --- /dev/null +++ b/examples/drawing/src/undo-redo-control.tsx @@ -0,0 +1,60 @@ +import React, {useReducer, useRef} from 'react'; +import {useMap} from '@vis.gl/react-google-maps'; + +import reducer, { + useDrawingManagerEvents, + useOverlaySnapshots +} from './undo-redo'; + +import {DrawingActionKind} from './types'; + +interface Props { + drawingManager: google.maps.drawing.DrawingManager | null; +} + +export const UndoRedoControl = ({drawingManager}: Props) => { + const map = useMap(); + + const [state, dispatch] = useReducer(reducer, { + past: [], + now: [], + future: [] + }); + + // We need this ref to prevent infinite loops in certain cases. + // For example when the radius of circle is set via code (and not by user interaction) + // the radius_changed event gets triggered again. This would cause an infinite loop. + // This solution can be improved by comparing old vs. new values. For now we turn + // off the "updating" when snapshot changes are applied back to the overlays. + const overlaysShouldUpdateRef = useRef(false); + + useDrawingManagerEvents(drawingManager, overlaysShouldUpdateRef, dispatch); + useOverlaySnapshots(map, state, overlaysShouldUpdateRef); + + return ( +
+ + +
+ ); +}; diff --git a/examples/drawing/src/undo-redo.ts b/examples/drawing/src/undo-redo.ts new file mode 100644 index 00000000..1bd06ac3 --- /dev/null +++ b/examples/drawing/src/undo-redo.ts @@ -0,0 +1,231 @@ +import {Dispatch, MutableRefObject, useEffect} from 'react'; + +import { + Action, + DrawResult, + DrawingActionKind, + Overlay, + Snapshot, + State, + isCircle, + isMarker, + isPolygon, + isPolyline, + isRectangle +} from './types'; + +export default function reducer(state: State, action: Action) { + switch (action.type) { + // This action is called whenever anything changes on any overlay. + // We then take a snapshot of the relevant values of each overlay and + // save them as the new "now". The old "now" is added to the "past" stack + case DrawingActionKind.UPDATE_OVERLAYS: { + const overlays = state.now.map((overlay: Overlay) => { + const snapshot: Snapshot = {}; + const {geometry} = overlay; + + if (isCircle(geometry)) { + snapshot.center = geometry.getCenter()?.toJSON(); + snapshot.radius = geometry.getRadius(); + } else if (isMarker(geometry)) { + snapshot.position = geometry.getPosition()?.toJSON(); + } else if (isPolygon(geometry) || isPolyline(geometry)) { + snapshot.path = geometry.getPath()?.getArray(); + } else if (isRectangle(geometry)) { + snapshot.bounds = geometry.getBounds()?.toJSON(); + } + + return { + ...overlay, + snapshot + }; + }); + + return { + now: [...overlays], + past: [...state.past, state.now], + future: [] + }; + } + + // This action is called when a new overlay is added to the map. + // We then take a snapshot of the relevant values of the new overlay and + // add it to the "now" state. The old "now" is added to the "past" stack + case DrawingActionKind.SET_OVERLAY: { + const {overlay} = action.payload; + + const snapshot: Snapshot = {}; + + if (isCircle(overlay)) { + snapshot.center = overlay.getCenter()?.toJSON(); + snapshot.radius = overlay.getRadius(); + } else if (isMarker(overlay)) { + snapshot.position = overlay.getPosition()?.toJSON(); + } else if (isPolygon(overlay) || isPolyline(overlay)) { + snapshot.path = overlay.getPath()?.getArray(); + } else if (isRectangle(overlay)) { + snapshot.bounds = overlay.getBounds()?.toJSON(); + } + + return { + past: [...state.past, state.now], + now: [ + ...state.now, + { + type: action.payload.type, + geometry: action.payload.overlay, + snapshot + } + ], + future: [] + }; + } + + // This action is called when the undo button is clicked. + // Get the top item from the "past" stack and set it as the new "now". + // Add the old "now" to the "future" stack to enable redo functionality + case DrawingActionKind.UNDO: { + const last = state.past.slice(-1)[0]; + + if (!last) return state; + + return { + past: [...state.past].slice(0, -1), + now: last, + future: state.now ? [...state.future, state.now] : state.future + }; + } + + // This action is called when the redo button is clicked. + // Get the top item from the "future" stack and set it as the new "now". + // Add the old "now" to the "past" stack to enable undo functionality + case DrawingActionKind.REDO: { + const next = state.future.slice(-1)[0]; + + if (!next) return state; + + return { + past: state.now ? [...state.past, state.now] : state.past, + now: next, + future: [...state.future].slice(0, -1) + }; + } + } +} + +// Handle drawing manager events +export function useDrawingManagerEvents( + drawingManager: google.maps.drawing.DrawingManager | null, + overlaysShouldUpdateRef: MutableRefObject, + dispatch: Dispatch +) { + useEffect(() => { + if (!drawingManager) return; + + const eventListeners: Array = []; + + const addUpdateListener = (eventName: string, drawResult: DrawResult) => { + const updateListener = google.maps.event.addListener( + drawResult.overlay, + eventName, + () => { + if (eventName === 'dragstart') { + overlaysShouldUpdateRef.current = false; + } + + if (eventName === 'dragend') { + overlaysShouldUpdateRef.current = true; + } + + if (overlaysShouldUpdateRef.current) { + dispatch({type: DrawingActionKind.UPDATE_OVERLAYS}); + } + } + ); + + eventListeners.push(updateListener); + }; + + const overlayCompleteListener = google.maps.event.addListener( + drawingManager, + 'overlaycomplete', + (drawResult: DrawResult) => { + switch (drawResult.type) { + case google.maps.drawing.OverlayType.CIRCLE: + ['center_changed', 'radius_changed'].forEach(eventName => + addUpdateListener(eventName, drawResult) + ); + break; + + case google.maps.drawing.OverlayType.MARKER: + ['dragend'].forEach(eventName => + addUpdateListener(eventName, drawResult) + ); + + break; + + case google.maps.drawing.OverlayType.POLYGON: + case google.maps.drawing.OverlayType.POLYLINE: + ['mouseup'].forEach(eventName => + addUpdateListener(eventName, drawResult) + ); + + case google.maps.drawing.OverlayType.RECTANGLE: + ['bounds_changed', 'dragstart', 'dragend'].forEach(eventName => + addUpdateListener(eventName, drawResult) + ); + + break; + } + + dispatch({type: DrawingActionKind.SET_OVERLAY, payload: drawResult}); + } + ); + + eventListeners.push(overlayCompleteListener); + + return () => { + eventListeners.forEach(listener => + google.maps.event.removeListener(listener) + ); + }; + }, [dispatch, drawingManager, overlaysShouldUpdateRef]); +} + +// Update overlays with the current "snapshot" when the "now" state changes +export function useOverlaySnapshots( + map: google.maps.Map | null, + state: State, + overlaysShouldUpdateRef: MutableRefObject +) { + useEffect(() => { + if (!map || !state.now) return; + + for (const overlay of state.now) { + overlaysShouldUpdateRef.current = false; + + overlay.geometry.setMap(map); + + const {radius, center, position, path, bounds} = overlay.snapshot; + + if (isCircle(overlay.geometry)) { + overlay.geometry.setRadius(radius ?? 0); + overlay.geometry.setCenter(center ?? null); + } else if (isMarker(overlay.geometry)) { + overlay.geometry.setPosition(position); + } else if (isPolygon(overlay.geometry) || isPolyline(overlay.geometry)) { + overlay.geometry.setPath(path ?? []); + } else if (isRectangle(overlay.geometry)) { + overlay.geometry.setBounds(bounds ?? null); + } + + overlaysShouldUpdateRef.current = true; + } + + return () => { + for (const overlay of state.now) { + overlay.geometry.setMap(null); + } + }; + }, [map, overlaysShouldUpdateRef, state.now]); +} diff --git a/examples/drawing/src/use-drawing-manager.tsx b/examples/drawing/src/use-drawing-manager.tsx new file mode 100644 index 00000000..10fc61ef --- /dev/null +++ b/examples/drawing/src/use-drawing-manager.tsx @@ -0,0 +1,55 @@ +import {useMap, useMapsLibrary} from '@vis.gl/react-google-maps'; +import {useEffect, useState} from 'react'; + +export function useDrawingManager( + initialValue: google.maps.drawing.DrawingManager | null = null +) { + const map = useMap(); + const drawing = useMapsLibrary('drawing'); + + const [drawingManager, setDrawingManager] = + useState(initialValue); + + useEffect(() => { + if (!map || !drawing) return; + + setDrawingManager( + // https://developers.google.com/maps/documentation/javascript/reference/drawing + new drawing.DrawingManager({ + map, + drawingMode: google.maps.drawing.OverlayType.CIRCLE, + drawingControl: true, + drawingControlOptions: { + position: google.maps.ControlPosition.TOP_CENTER, + drawingModes: [ + google.maps.drawing.OverlayType.MARKER, + google.maps.drawing.OverlayType.CIRCLE, + google.maps.drawing.OverlayType.POLYGON, + google.maps.drawing.OverlayType.POLYLINE, + google.maps.drawing.OverlayType.RECTANGLE + ] + }, + markerOptions: { + draggable: true + }, + circleOptions: { + editable: true + }, + polygonOptions: { + editable: true, + draggable: true + }, + rectangleOptions: { + editable: true, + draggable: true + }, + polylineOptions: { + editable: true, + draggable: true + } + }) + ); + }, [drawing, map]); + + return drawingManager; +} diff --git a/examples/drawing/vite.config.js b/examples/drawing/vite.config.js new file mode 100644 index 00000000..522c6cb9 --- /dev/null +++ b/examples/drawing/vite.config.js @@ -0,0 +1,17 @@ +import {defineConfig, loadEnv} from 'vite'; + +export default defineConfig(({mode}) => { + const {GOOGLE_MAPS_API_KEY = ''} = loadEnv(mode, process.cwd(), ''); + + return { + define: { + 'process.env.GOOGLE_MAPS_API_KEY': JSON.stringify(GOOGLE_MAPS_API_KEY) + }, + resolve: { + alias: { + '@vis.gl/react-google-maps/examples.js': + 'https://visgl.github.io/react-google-maps/scripts/examples.js' + } + } + }; +}); diff --git a/examples/examples.css b/examples/examples.css index d2f7f47c..4aaa6b3d 100644 --- a/examples/examples.css +++ b/examples/examples.css @@ -87,3 +87,42 @@ html[data-theme='dark'] .gm-style { .autocomplete-mode { margin: 8px 0; } + +.drawing-history { + margin: 5px; + display: flex; + align-items: center; + gap: 2px; + height: 27px; + box-sizing: border-box; +} + +.drawing-history button { + height: 100%; + background: rgb(255, 255, 255); + border: 0px; + margin: 0px; + cursor: pointer; + color: rgb(86, 86, 86); + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; + box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; +} + +.drawing-history button svg { + width: 20px; +} +.drawing-history button path { + fill: rgb(86, 86, 86); +} + +.drawing-history button:hover { + background: rgb(235, 235, 235); +} + +.drawing-history button:disabled:hover, +.drawing-history button:disabled { + background: rgb(255, 255, 255); + opacity: 0.5; + cursor: default; +} diff --git a/website/src/examples-sidebar.js b/website/src/examples-sidebar.js index 47186e3d..4b6eb64b 100644 --- a/website/src/examples-sidebar.js +++ b/website/src/examples-sidebar.js @@ -14,6 +14,7 @@ const sidebars = { 'markers-and-infowindows', 'marker-clustering', 'geometry', + 'drawing', 'change-map-styles', 'autocomplete', 'map-control', diff --git a/website/src/examples/drawing.mdx b/website/src/examples/drawing.mdx new file mode 100644 index 00000000..32c16fb5 --- /dev/null +++ b/website/src/examples/drawing.mdx @@ -0,0 +1,6 @@ +# Drawing + +import BrowserOnly from '@docusaurus/BrowserOnly'; +import App from 'website-examples/drawing/src/app'; + +{() => } diff --git a/website/static/images/examples/drawing.jpg b/website/static/images/examples/drawing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb2a15baeac4959d3d10b9485e0ece8d22d1bd7b GIT binary patch literal 46887 zcmb^Y1z42L*9VT@OQ%Rm3Q9@}(kUV>-MP};-2wsv#QTckcPzvomMr%$&LBoO912XOSzwZ6!HHIRJzP0u)dm0J#e6 z$okq@1AvMOzzzTa4uAzB0nkwhg!%v=Y5?;$1^`_U%^z$EV*9HM8UUb?{!>264#4=U zJc{P;fNJFzrC+U~Qk*vcfQ>>J5Bd0b6G8vMAT)F!De^ZaLH#!T@$WLc4R;(E{7*Qa z{>>dQ!S##QKl%SBL~Lp0VSySJbyR6{OAiYt6s|!=s?X^8sC-5rPuE|#ABD-> zQ5{6#AHT58e=y`1Hvf$=evLhuySAnbYJe$GlSyD^=57N31Wc%W25$=+6di)6DE!db z(#{!$QTKqPlaq@j3fG`88>);e3jd-nZ2m7gHvhtAX6Aornwi=B!T;d}RTI_lQ#%h= zM>D_QH~(K=oE*JSN4#nNy*w#xy=WlG` zA%hyr|J1cKd#e05c6L<#HQ&E!THDF}5~SbQ&QnqQZ*1iutMxZ_chUUQmbJT#^xyer z?kMzET`vcnKl!#+iht<)+iL6mUB=r^SM_h~;h^=WKmN8dfAZbEH2?J9%31!&-{q~{ z<^J&Q6@k1Q`x`ETRH3e;n&sk z$)C1d9e=Nl-!!cp<^SY+cx(Ns>xmM`zv;Mos{a{7do!h9a{s$7@D#8D98n(zKnLIl zL;zk?dAeE6TBppc-QV2uRH?vC^wt2@zm%I}QdxuB$> zd`xLY8ADk?IYoIz#Xu!X>9s@ap zG=n3A7DKYe&FyR z>%n(+GX?y8X>7yqPpSVA%eR3fqDib8r{uKSG{L`4HBeEp2IxE#(a5wP)C`3C zHP$WGz0iBAm!!9%&!ZotKV(2{U}x~v5Zh4Ku)y%lNY*ITXwz80IMR69gw@2?WWbc# z)X}sBOawLqS3k#muJ`=&bGVtBS+3ccxuSWdImAN7BHd!&^08%#<*t>4Rg%@VwS;w& z^^T2%O|s3dt(0w=?SY+)U4|XhUco-w{=z}cq0j;8sOMPWgyZzwsll1V*}=Kn<*tjb z%a|*NYozOno2Xl=8^m4Ny}$$HVdC-ClMJOC4STV9MR=`xOM1WehWY6FRQnS9I{Oa$ zvHL~)ZTrjle+s||un6c3ycZZ6xEdrKloJdJHV^I$VGMa0viU;(MNueTs6*(tu!mtu zVW;7G;f*ipUcPv_9w8r55_v1qJ#r>WEGqjI#w)v5Bhind-$f&0EMo>^AI7G|!s9IB z24C~Oe)}33Zyi69Aeivs4b~gyH`9qyiA71oN&ZRe$tuZpDGVtwDW|F6)PXeqwCr@e zbg%T4x6j^weaH0f%{zF8ZN}95C+{mVX)~iUFS0DN#y>p%P@YYf9h-gi(eC4Hj(kpC zE=z7&9#)=r-d4VDe%~kIPsIh)1+fJ;h0cX5MVdw3#X`l!pJ_iQl%SP(mF$)pmwqpM zTK2V^t30QIq9XPS@Wt!PUgh)3=_=)_&T8T6@*3uv%v#dgm^x6MUmc|0wtnTS!Pl_{ zrH0N%vBuga?xw=#d(H1#$XgOx@mgQDBHR4i&e~nu4?1i*);qzS3tjqMlieEKBR$GJ z{k?L%U47DhZT%Ac%>$wX4THji^+SR~b;AO~wciB3)s6^`)Qt*_e*G@;y>U!@taV&! zykp|&MDL{H9bNu*t7@`l^gt|kKCviWieiokcpLU+9pDmp`onK$Xz^GtFm%^8QS9(|5*FJD; z_}iNYH;o8o#1Ets66tE@ZuVOj_+=5HS)**4lR}i;U;qH5-vI#6=s!C3?-IZ5rN0nL z9sP~|ll}|;NALdqn;-z>%>aOQ002Du1_19e0DuKWpU4;h)QM2}VgTBsM}Oj9{_hmU&7(&s<>|jtWII5N19}5`gATe6 zpb>-6i9yJ2fF8vMCQ3;`g}+-snQR!CSlBqYc=)ISwYLE@5IQ;<20A9@FCzpL^vk5f zAjTxQ$19CRs$qtG-;InfG%*K<@kwO|x#k#z>5;j67%m>g9ZD){W)@bq2kiU;fVC2vv%?B0Hi7_zm@nVrkYhatXk>2ME#UXo= zm{Zw-%lJqWLT>IphDX7~zsd~##oBMq{%?$h{lDVu4`cuEwE)PVtlM7!4fRDwLqkm! zIx3*Fw_gDZ8>N7u0!q>P9dLdJ++P8u7yT8GC?cR=HPO*AQD1xH|cGOed8^nr4GW72Uwf+=ikgf;P9dRT)djhirY0L0(C zx%V`X2U7pC0NPp$*;Z+Qd~fv4n=Cza+J19j9(PQvu1UA@`K$Nh3s(>Z{Fzcsl8IVNNl zzZI#Kdl|Ivt=lvw#dYjt`rba^urR*OTt!{l$;@VT)~wym^6Nz2>;6+vE(R?U$kgl0 zu4U~8hh-c??^o2XwF%3B0VLEhJ@)&!eivwk#ZSSO}u1 zYwJIGH0;eCqi>&CJYWiKK?3yBAB;m5=~M6izDma25M7JmBLPVi%@-9Xl6v!#2%C$z zlXb)nyy*9}_*CO2D*_2*^CE$Ey-V!cV)*DW)n?z#*rmqrtJY55zex}|XkBJ6JsL{5 z&O51i0`r3;tP%CRA1Wb=GSry-RHfqwfp!>gD0dgY?4A}ZVQr?}245g=P` zs?2|4*I4m-D@=^eeqSkut$CTSXX~4DeV#^`a*N@#i2w;t#>t~|l$3;J?o-!yXQ8jm z9Gd0sn$k2tO-t5}iF{qU4F$eUo>QZG9a=jHS%jybPZ(i*M*=khxMjWR=*xS!93ypQ zUgrh%$`!+HGtcC2&{5rNr$+)zK?zsYQK(T(zMeq>_kCa8yq2;PWR{O;HJc2onn3ZR zi3GZ+g2$1-DLWF_*epZ>cPke0v8|`dzkfjMOX%|ol(;rVj3XpqUTcS9D@dR-)WzoW zl75!zg;rDSsF8!ky%^?5<fc&%o-eqLK^!FY_VgZxgPt@=#MPg;0>1%9Mh`vzOW~ zNmq$r7CiG{L>f84 zzt3~CuT_V%YGV71-kUMR=wxsWljtud6GSn6I5DZP$mwj`D6iyF`CqY6uB% zp;XPCLx=Awl z5ngRSW2*+T=v!}W^@0c;8mv^12KqvI4z|~XRioEbZXFL+D`tC&rm)}~$voLq_bVa$ zJW9mGGyJLDz3^)H6%zPpF9kzK&2;#UK^GDj9k|&?0*O-GC^7$cQ|eL{YV#`58ml31 zz33f(&DGSk&RSax5+H;VR_vORL9OfUEI#j7Gf@X6_e)N=A9cv}M;aHIqe}{w2b*&g zeDQWNJj7k$^o9FqAR5i3cBm5&01~)lKmxk1NZ{v5h(D?mYMn^nzeFPB|5q9b9lDoj zAqxhDuWIof(2IV2O8wZ7YX0a)KdwUF54lUq2lwu9J{G2>UO_wzRC&J|6;*n4n#FD6 zqd#@LGQs~%km6)%Z_Tlq@Y=vaKS$Bp=Q+8iAk*0Y(yQLYYih)}qY_WV$r8w zdWU$xVmFgW%hcg>aF0}tQ(6vJSyYtfIhi?yWmBE3tJsT^NU959W+%O4d7*H{rcW)p zl^ep^bv>D_40-u|cBn#GoOkyk{WzJqCC6r2C`s@*QO{cc`5W!}*|d7^`srOi3w9N< zaQ2;!)TkoHaAovv{ZjtSjJTsRyB>i;6VBtGGZjxhyCSGH>iN?%LLk&q+1V7q!&005ALn#k1UWMkDBWx7 zGcCRP1ez2vxPZRCWpY}oDm(hEVza|*{nw_WZ zBAyL$hHa>QlYfvDP+o3oD!-Bd=Pf*Zgan=xB2?#)0CevVaW}Xtgz9XR+-MH|c)YFB z^Nr6BW3Ha&adP?&>OMyJ;p~_BJf>}s+95@Cg>5ihHDU~kxj`X#9d=ny!m0T6l;&+{ z@-CPchJW4%Q(3Q=M>oC6#3<SMn+J*u1eQio<=pdFY z5In&=Z0{YJxZpe^&IifdaAF{amB*5nZ=z$*w-p&83~Ow7%xHv+@vgu`4Q|BUoy}yW zYZG=tWyfu~;_(kYQLDxk+j&lBI5`Acr>E0j$ZyL3zN+Q6$stBikEPMKsAn_>JR$kK zR_fi&y7*Tl&?v?JR}w@PVq+GvJsbidM@S#qhdjFO^>af4p26CGC0A_!CKCRC({?1Q zZn6Tst|eg(U7|-(&$%^7H_HUk2Jps)5nA9~s#l6?1upH`x|5 z^h!05*O5864YkdUbLaU#efY(;f==k>bWf&6FQgeO)>S+aY|z4(W;^jaciGy~AoJZ{ z9+w9z&GV^LQGAej|e=(Xhp0{!_(w9<9`@?!@N8gg+cHc4nj-K0s1Ft~b#QjSl zk{tHExy{Fzl^uJ)S{sX${W2NMp{I??<%}NhOWGp2Mu8@kwY$L(nwVMG71Z!p4lg6tDUwXr+xx1yBUvV_>)b$0X5 zjkP{_Y`HC@DQvkhz^}-0T8O~SMgsTf?*{R=-85Ewv%g_ODRQ={D$0Ed-Dvv-1aKL6^2kRwBcTq%p&w9{9)z!};g+KVphtcPN2H+sem zu;@?5yNxW_pX=uXIVwUd?e{BoIGpScH+CDBBUap$M5136rriHFOE6rwvfn#N^pMz(FHynIV?Z3>l4Hxmvhad$rC z^ztAZ`@zV2Lk~-b)VF6-iipZ#Q88M z-A;_&dWIk(CBvn28O@HK>@54We^5gDTF7lXL+j`ezpehjeZspAa|dfDLzL-*>FSM6 zgP{w@RbTht#z>foLc#s|b z_0U)PMV-K%_n2u<=O0!n5G{D)$yNCFHTIw?YBejbF5c2_7XP@# zHuy40gcifv$2bz*?fNc^v>OQ!ON#F-lb>GW52+EttjAF*YYn&4Mt%JG8WiIJVOz%S zAxg~?#rtS6{jo{ihc~IYFCL;ShD(B_kcK;mQE)tceMorCA?bNq_2kikb9r*Fp-OX| zVqq75eU$dtrj;ERVuWBwIK~%G+}HEu0*yEEn(=wQ{Y6|rDfn8zSsi=*_@L*S2ChO+ zeySD+zRjNx*-T3fU@6!wGR~4Qp5iuK(zkFZMpq!#{_i>9K!w(X!o+n}5(onMYwMcYpcv_Ia*c0QP`zN#G$FI`!>H^V zZ~am64k4rl@z8*UuZ&{DRqL*058?HM1;V$eMN+yY;g+J#OwVt|^_b%DPTdPJW8yw* zo+m2S)0iUmr{`_!{mY2^5;Q%TawK&R%NO;)5(!u^9?0=|yvu7tpVtWfwRs#}YyD~c zcLwnESKR&jpc8(DZ5cd=*7g)`aLpV1%~S$PI2s%11^L+}I$h$c{lj#5SFm1)Bt`wRsp5Sb zM>ae@RRH~Ch2eK`iI2Wo3Q=8%JC*elj$EO{Muy#Ax+u-{51)eM6q#1M1VSeR(~$rs z%Iry2g6d88ApvEEifWGakcD&B_vfn6XBu&pg2MFYmzY7Zw29xSzu{xc110Ehq<5q% zlq%q{C>G)i5y=YcQP)#ykglKaU?QcqNT7+1`W1*dQ=1byr@4t{yeVszxmJZUOv72%D8@9Gmb>PK zB0emZdForfDj9XXmnOqCS#E{PxT=Fa$VVoBRk)7wyC4C4NshUWLbxVmI(5w`z?zG| zuq;z3nnsXM$66jw6-(iiTx)f^BRhNG} zEI02LoDbIB`m{{#X8md;uw_2TG>#K*@olB2`XcXQRTE?^32%{5Gf5EVX4`sDfVYxm6S4xrdOGSwml;kY> z)<4cLI(%};pd0O~goaOLAUz10h0l&Wk^JJZ5trk+y8%#0^ zbk^^L)@qkOd}W)0-ETCjxGEe)b<0 zW(cJ*b5;WS@$FFc85xU;o2agtc|61J!@#k$tSU>{xTDUWHJ0&;80!pP<^FBfdFzKmVd`o#5+x}u+{3rJSQ{~sB zxkc#_+}A0IA6)Gt$Vm&SdV1~mhl>V!mbiy^iMmJQsZf^qad!wzpb=$n*APW#)1vfq z#^qNi&xL~*%46a1KDVK*`b*o-Jt=p=tHqG*kO0vsSRS-YJp$VHN?JngJZr@F;wL*J zRA?RL;du9lR_f50{JHlXM3DTE^x5a-5yZI{`kG7c7!r8&4|R4osPejIj?N!asuJ+Q z4Yt3WZh03BS5q#(S`7bh>M2CgZ8Y-m(O^c@GolRTW}+=Ojgk7RpG0N42%n4U3VO0u z0d{gQ4eTZ9B+8%mV`F`JxQM8G`E?<}ri~b-YEPs55b=6Evh;Ja;L9`m2JGpQ5V7mI znfX9%*n)!>-2k-jRsPAW;LH@aQr#_A>Et&Kr+RDYuf(O-)Z(TkDPUUb9CMxvhmur0 zA=SrmACyZg8scJEChtos9ci_XVzu$CM;gdbrqp#bRL=U(jJE;etk7_c+NnSp$Op3K zr*Q^*yblsa^=$|TvBVnGUA4CM0P&e#XrxL+8u{A2Au3scD#ZpPpRxRGp7)D)%k>h< zz8!%1lkIlB4=Muu&rYP&w_!Xb#xUGmNMD@5F7t<}{4l>-s<GX4oAKPI>&krI*F$CE zh;erM%abO>>(UtPU2qD04bN--Q5v{TLqlENux;lEV^|M7uig#2Kyd{$LAMWOZ{#Ql zDll)jN5yJWxfV%yg8(eNSPy8>z)o7NGj z)4ITh%`k7K^T<->8|=9dY;oMOKyC;{NzTuZK<>>fl4W};kdCa$_-!n2=Z!d<>88q5 z3q#L6S%Z^L%r`sN^_ThCB{q@rl~9*} zLf_IJ!XJdrRo_S-5Kt*`YEWr|*p+K;l9a@IHu=sp=(x4l197zXC)-gQXFMYJ;{dCa%^L4_ik57chD|G)ISSxMnqPJ zARALI(@rbzu1;M#++^W0ra+2VL}W0p>8Fr@6b)PrdMlkfVl9E(LG)AHb>L9I(B*dY z`I|0xu{W;m#EBhLC5&roy|xVT(|x^-H_g0k3hS|24NrA6UZ74c0k?p1``W|Ps4T6E zF{UJfe8*Xfi3+n1d8{m-YYE8Nm^FztPOq01>x1g=3+xMdv4&`F!#PLe=}#qK2}l5| z9t`(RfEi@dO6>$d=@Ep^ZLq`VD#Vex5wDn4Z{3oUmDjFqQ^SPJ^|Tl~CoOlA8n>wZ#87e zfPY00avYJ;<~-D*I=bFFdu+|d`7w>@r+z7Os4ku;%VC4?e&$8R`#`<*p^)1!`YuU= z>T1E_kMizx7e}PZ9xUg9&n;e*OhPc70z;tD(CuEXfbQo~7a7X0t+_}>^? zZIwzx;8U1dlc+fO;`{npMQNLPLQLyjn9cgaH;$fq#X`fq%2)Ym-gDIbQ5!$h7CSik zd}*p&K>|>1zGhNRXeQt7u04+2sS2($FY2}2{MF8Hx33GwqAGid+NN8#{e%{aqY zzyaA_A0Az4i@q9-WMZPU3V4;7DQtIV__13bP2<^mWksEoRW@bd1C)3MvD6m!xa8T_ zJ!bl}VQxx()M`PC)_tV2@@3@VBtWfDUhk7cxZfcgFMtyx>Q4Tc z6(CIpr@M}*sgb^GmSlf#FVy;;|Dd7t6s~hR}xS~AO@hjD=)9KR$5 zIeKSRuyb)x`lT?NbEo3o+aiLF*+*f`FFYob;~mcGJ6n0`rr@j=6&<&YVs|tZQy$)9 zV#mb@3&;%3T=^LT$DF{9uEjk(^DCQQ!w7=k{`BhjIQ$S?)K*>5`xulm(<8`|*@ZxuCdEZnY)RG-+4z(=Sn8shgb=|T? zvRpoY_x3kAb~u-iI*)*5m&0wLF}^2AK+OT)t1f*nJGF_5)9dsJ&tE1~KjkqNzsf2_HglG@N-jd*~+)cd{0S9!5)VRH6Rpp=5 z5wc8nk^ek(wzNHLBW$Bol~OpoQNH|EJ5jWcy?>DQ0Y>qT+k9SbYfnkZqke9Cl6kcN zrfD{d=y)9>$Mesg8d|CuFBvhbbZ7JmeI}h2f1tcMmA_TDzg4(@rS!;&n}8(wG`TdH zhPO$IM=E@6df;;hm{+l#VMrLiLYY^Ki$cU=+gkI6UK3;15gaaK0CLD(wMK3F4(Aa^Mb&&L89KQ}*o2Ll=2gJO5bZD>)XS|`dVKZoD}F37xp`_3 zmiH{~DY|z}0D9?qEppB5g=}K^^Opq^aE)zk6jrVZ@o$8q#juqr;1w3xQ&8)qG^Q1c zdrw0i_%Wx3-Dle~hz5wdx98sr<%nauS}Xu%hGb}0wi)Rg1QAyuq{oxA3T5j zJpV-TfG@ARQVHMScB~5vU(qXF?#p}^H!1f0z@@2dz`tN1fIl>LZpIa3+?MEkFQ6z* z&!x4zl=8(jpWYS&wDC?P;vV=d7qx_SCzag$yCvJkgUkUnSs9x-sm7@hDRn=o6h<~@ zK_j9PFTF0}f@<1Qt`5EMvD%y-*u*U|IdD9o^a~SY!s5t`U{=7UWTIDU08=gb+N{ZC z2NbDn>^(wvAx|?9tygPx#kp46DMzun+XtiAV{F+{W4KO$r^60 zZ$;_-s%ufd6ZwX`N$0>(K3>LXqPdsS_3wlpP;t6Wiu2W8zDe~7aIfC)ZLU$SnOM>$ z9Za|{r|)7JS7eP|jAtM%0W$lLTRPJ_1`FxCNS`nX7`7tL|M)pku5S{QmW&;4r5^|`-@VfMI#{+j>`EdL z{-v};w@^v^%rdvB-U{}96;fMCih7+sqL#1aawKo2giCwtEIP+GxvP~8^|k==?WQiz zCDX62s&pXx;!UEFj(VmIIh$DFl>Ms`CC`H0$yiOJg3_7KHnREqqHqQN*W7Ap#ziWh z-Hm=E?3XK^OUgL_)G|wGfIDrpE0ccpgUi3f8!LeZi)HXM@`sRwa{<< zCTL1W{KJpaicwf@olRu-X9EfR09n7mhf__prFFVHONGHC{5CW*X$vePVMBV6bWiOB z8y)Lsaq@aqyhG=v&eTA5wN;Y`l3) zn;m{u-1JT7()7VqQ>M2IL4pFS&3KwDGnwEqu89w6Cb5k5`|)hP_e8(ETVszx8zaGFvS?yy6r8jiFtzeEV_@ zeUF69n$9q(eJ{>d{cJ1-tg%vp^j)ocm|8q z7!gs~r|}MRlhC|lG(g8D_}opvw<1Kj0T9`5I$Yg}Jo#$IH}7e|?QAu?oSC|;(q!VF z%^2UUTIQ!3uzVtMHPdw!be2@R*T*L^+`3aan8ubw!(YgggjX? zG7@B7#Eg+LzmKq4cOpMToiRZW8NrF5gD`eF#acPR0oU=j;x7myUZ{%?JbEFz;k9de z58PzN>siTfVH(@a{Mo-^Wcbp5(niTSOV*C7Gls1^oFO-c4fr1-I&uWW^eso4f?VV&S6VN)dn_| zB6`5M&dnYrutJScvoRhne6CV%vuoylhML6G&X@DJ^Ky+rnzAmra;S!Wuy%QJ3 zCY{Pbp7pASdj~g;f#o*I=FF^TiiUiO0u!n&A)`MY5tS*y!{IGUF zy@r+Wt5uEL#F5X{@NQ`u^1j%ulD~StqKC6NN00N|O<2ipx?3y4FuA^kRbV)G*_L%M zZCx0TsI1O zGA&oz8gWa9_3&R%~wcQQ!!qew@y+5dqYw~})8_-M=7 z96jl2&MHAYRp-R$riwgyR09enAoP^Yv$UYCZ@y^ zFAJGh9!7LoY)Q9x^bz)Niw9+1Q1IQ)FORTviv1e*$g6!+tItKv9*(m3!XoD9=ixGA zhEs3&r!fX!ge|1bVmW*C3uDB)EoZ=!qg?r+4O#5u7DtLrWvNNd^G@|cITuu!pTgS* z#*(P1siKD0xmY6n8yM zP49)rhR2mBOF>uSqQRm6T(qC*o+=5e9a-7Y~SYQ{^q+^ z7^%idv+Dk!55S5Zy)5~KexQUXS)N=>jd^K$;-;#5X6DAx>@WNE-v44CVk4&z9j$`F zbGVR@HL_sxi33vOcrh!7oNYfYg5hBTKfLvOk0r#;Dp*kNquiNw%=7e8-w?eMN9X%E zp8Z==wtBQ*lb9}}nTVTG*+E!s0%ts5vgABIy(6rDi%?9zYnH(3eBjnZIU@YcKmCPg z3(0=_67y8KuI!YfN@<2CbYSzXN#Gn^^u<#K(11BFxNIwsC|w?%$gk5ORfM}-Mb?yS ze#XHmNNr>~Af`f7-DT0o`_L+gu8F%P;I7LWmiJ6W#uH_lXhqg?AL{;3Ov%Xu{Ha&W zc&39X4+N z-7#V{OqGnqauSp1ms3S{qAV?rm3wvHO}j2qlw$Ay{9#E9ZcV)uxK@BOhp(!|o40+p zAl@;&Oj2Ofh^T7>XDCDp<8<*ctW!Q02K0XNyv{@)-0b!xpVL8|$b^%%sx{nnoti@( zK0I6*9x*Iw7SGlx{iJy1z$Q79ppdt{FGitOy>mrZoMe#oysj?vF%M%VI~yf!cDt7_ zkZ}_X!-tdxGD9#7>DDxMurYRQT2SgJQ)8Bw%s;a=J?u9CvkU zRPLg)KAsvGSYpxj?9tfPHg=6~-;x>FTW`YmQM=UKSDh@2JI8x{i{Jt53Irw>eNxrl z=&LIw-|Cy%_(0yYp__Cfo+ZVQp~1>V2RQ$kse99$Yy=wWp&93A%(V))KtE@MO+#WCLJ?yX z^C8i9iJ`$ct0l{~Y(-OhBDyO9p7nYzZg;+%@I!TZ&CmJX72Wa)-ED+{uCG!51<@IE z9#^MHs_N`WxsH1wy(9l?3&FQ2+0u7ZA&~WY;AyxhwKenU(6UB%*JH)w2Q#ODp;n0quT=zouNtTE8u=r;>lzKIvMfq@Nm~ba8m~Nc$q>PgxejbCqi&lwTeg!BqWGjF5gf}KmCuw%A zSW|~(Pi0AEvA)U08>M7u{M)1Tf5F(u8N?3%p+%48^77Cl=FDKN{%3oJ!sq26bdEQ| zT;X9-cyRTbyrUT{SSm{;SKoYj`C*R3yRereij=(A^8kJWv3`Q4!$C+qxCV1H%-M4p z7iNf90u${yFFRHy2|C2Gjm@|-qUAqr-(u!yr^L4YF5b2>6Nx%wu6tAXu~L6Rf9&Ak zgZEEHH-Zy}5hY<=Ji0!DhYGu4n8D#)`kcB3CR+mc7w@P#9esFhz<+2xKjtu1CLk#$ z(%nbJw)&tp*s^}_s>Hc0DEOKldkk!YmCwlE>rIOK%>IZwd{eOia3rl$0m9;s;J2OY2!wAg~`?a+4o|))QEJo3meaF98sg`ow@qI z>2lDo*fjs-7tJk-mKj2 zXI;LrAM;MMkR59EVrkB54sM`R&^DksfcVHZg=VvrQF33Q$1ybTbPA^|d^bqghsajltu>O`Q}?4}F>I{ez@mZPP@k|; zxLCfgR(qqTcRYX3#2FftJ?Z;!GWP4x#iZ4G(u>e-CNwF9mCTvBZ&p(|tn6u3PQr!{ z7AuVGYnyZ%E|)A`7TcKSH(1fPEW7OI{G2X>67|jBWL|kUl`StV{Ae8D)cT=#U#vpz zd3Tt+g|Qcz-ah|sC*F5O9>#4e5yd4{lwj%n|FI0fsIwUmjb#`+b~I{_P>ZG(I{0+W zu~Uaqpv%@U2%yHi4o=)6au#+vN=J$5d`>p9@ei2-O8{Re>`GWvwbsX~-g{w=d8#^( zFtXS*cqC)y#AG?~Y7S*fM$;1ollfY^PzS2baEgoN8@*v_nJj0l4OQI1@7Hm6Yadaw zhheW4!pRuVgKru_?7`T@tX-flA@EQ(;>tQ`e~?R1DuCj%`HibJM4h^bu?!9Z%pPMZU{An>pj0TMzA~LmSxMKf%QQ8gZX$ z+rz7(8jgD{27d?>!;DyNcff$K)aNaB6xn4=$4B4Iv-7j>SbM8-zu%Hwj*4ZO_LTvh z0aXe-O^kmSs$EFSPtI0zuyHKarGVhNdqjg7o+sQm?qPQd3!wwAdR+P5G_6=) zIFGxjK>|)lU;%wKB?P_AHi2^I#8==`q>5Z$SL35yEr$or9n)M->|D4nI!$!)W9GP$ zj2&GqIA32%Ljw@F3)h^1`V)&za517t0S2G0kettR12pGixBXN`P5RYxurr`1xZC>d z?&oPqE~_c;Lmseb) zQ!aZRJ}Tb2r(VpaBDYVH;oal}5-ZpaBbwJ2M%V*#dDxd+JI) zn&ES0E%Y`Uqh`4=9J9h`F+Y(&jHHBGWH5F!)P2_2{(`reV%pHFV7UeiHdRVHud8%n z4^xhfW{k#vs6N8?c&nwbPpT3dP8Pdb(Xo*IddBB20aW)>po<~=)efk~mtCtjmrutb- z@ouD|=$kcY5*784#>MbRRCmLALOK-0m9t^eQr2CC&ev`8Nyc@OO=&Y%dW5(5hW1#U z9nLk9;fWJk3_a5O4*s7mtFL6CE^*EGR_L%o$bFA>s>eK=G~QM4Y%4qXb{vf>=;%QO ze%Y{VQC(88qO5SHWjwfSf$w{j#p*+UogaE%oavhT4Q3?gD&DrOgrW}FHM?Bf1kZiA zKP|PAw?y{c6LlVe<4OHwFr6*&i}Nj!tu!tz4F#*O4TL_nvG|<~CLT|cirmqjUXY(t{cc6#95=07#}F}l>^qi&T0=i1V3L4^60u{o zw|^Te;&;~SJC(EPVKEB^$|ij0!ZrIPgc&Jv8l*q?9ho0vFPTKW81!3>@bDjPM*??H z9#f(EtJ%h|+5WNSUJXXS49_%u->H|F^$jUQ)x!)2{pycS&&ZqINMjTqQK^Uf*o@AP zb_hH0tdwa>w&Nzbgh7UBQJXN)UUW;yPvT#j zq6zyC+g>lq?EeaN(9KvpGU`?zN@2n`n@%+!6j;o<`rsJpWG1y(aiPqt`;{pyo*t!T zKdqhlze!6|Q=^>_u~?F7)pB!9fzEFyADYuk+mf-BS)a!#yw#?Mlom+Fw7w1mo%AO5OHC(dZlKTmt z^eCb@QiAs5u3zt+93lr=QaY>d-SOx1I+zG$LjnvxW5wwW+09yfHhxg^@thU$#H*;r z2>kpOK1xc$4!0DAo`yU{EYu(RAud9*17=UmU60qB-2iEO>Aa&IsD`~DU-h{U_{V*y zCHlYW#IacXbV0B4CMqVCn{_4Z4Ud5)QKW%hZ@Q`OuAyA+D>71wc zwK9OEVqFJ87Z%ZT+R+P$x;S)6&8?)M=1)8$Z5)Gde(osi&0fGg-nGv7#c;GYcEoPx zG3g1bvVN=tKHsb)R3IsXOnUt3fQgs?BOq?RZGqk9g}m|M+aQ&FVFp3HOKAg^I=hZB zJ8-kotJt}}RGLv4-T_(`T_UgGQwV?p`U)fIvMhsDzb!3XQLk|Fxp1th{#wh@!S|8Y z{g1@q9ahF=AG6j9z+h>`xw$pAs8Q1M>`NDOK5--1JbxsAj*{*gj~Wsu-xh@EVl=>g z_{I1%aX;nMyw><47?Y*B-%tx2=)(xdG{3qt%6^ZX@;&=#n{ImlAABV+)7Qdzxw zIJA_)V=_zhjId)krGNhDTHrR%6mE&o1uTP)Fxf}S*JkhJP$qbZ-e@iQyAr)0eRXSx zzv}2l*xuC7-(F2lI@OFakF@rEdpM3Dgt+niJF);r17?AUElMVfp>-bFS=YzsyFz8= zXR;IH@c0Ir6itnw8^;+Z+kmHG)0AKhpS0|FSu&h@%qSxTAv8n;_BcOHM zy6E#E={Vj2$rO*QE=~L@%steTXvrWgo_8M|QEkG;5hODp>6T-n3gUPYzAB|5pzC=z zLo8nWg?CZ;*@#Dz#C~TTUdR|wZSI8XaczqlSCamw%3GrP3{>#?m{if}jyKh`r&qaI z7=8|@hp?lsG4kjml=u9l?+jMxhx6icVl_k)#=`WgC6T)RODd+(E`>?D_V^`zGSu^p zg@tTIueLfR-4wTNkEJ4-?VDq$b@7p$AF$_W9FdRah8}w$xwlW@+Azp62Gtp%hZrjV zVLjX@$<}m?VlePei6RfATPRBY&A>9l6)w-NEA)H$F8CHCvc(WCO$o6C^=PQCDO)T& zO(dUiFqs#)%r$^9sxxk9+~8ckWG0Xcy>(J6x0WZ)z7S*sjs4nqhyywqZjjB`BCaAE zjT`Gi3E@rc!Lg4)+n;)N3rvf+_svS|o)~@o(`2dMzvRXYax};lJ?vy^4QJJTJvu7IC%v+VN!O`r1LwJQI0j@PW*#`Y{+%IHPSI|RmXhVM(~ zHRUSO-72UhNNT??r7dXZvbzGri?4Lxm&V2i|MTa}q9frrsStN`c^Q`BHZ$aj2h7b> zp)vf_WWFgup)rA41CPp25ks|C*56%;@HSMvFd5Z(!K}*&x`JwG!5kvMyw3RHCI>R^ ze6r0iFw3v_G;YW8pgrO9_297wiv8HEP@G4*Lk{Lgkv&)z z!!i(w1~M9Mg~v|y_d1Xm%f{dd&E=cPbpXX-CRwvmLrWxw%NS?ck3|%vQ9>nYim_cav_J|5m8gUAF{09OT`1jU(_#43YZbWI>C#O^UqW z`AjeA)@jg;OpK-FeaL`#e-~`rFN*w{4uV<4891FzboSJAQ8!QQMyHhgy)>8d6?cY4 z;b}DLZIVIidsqUrB7bg6Tu4}DO;YLV;r&^Y<wwIud5%oG&bj1J+M7DCiKu) zi8KjkGaT-Ih}4S4@q}<5 zM-|Cd{Mq3AKs?5_E2U4J#U+q`C;Y*AfhP2+e3bC0kxEad*cINmi?3!%w-7nk(@#*# zhOn4U!L6xi8~~c^7NQin+pOpzm1V`MqBFO0MYh8Fvx*y$ zYH0UKl!m4DLJfb;#N7JHp}LF8W^>@V19~n!Av+Ez(*@Ce{J)LG&D*=gEUIGlC0|!f)mEHohVf6k;SA(QCN`DF9~CCNk@hc_tUZ%=yK=&= zfl5p4fV_l2OW#ab7Q&5g3az%S*MX?X@~f^{S>k^Z{ORDiyjj?WaZPwTP5Zm3>Yq1O z81}GU#!dx{7kGp@0Dc!41}kaX1a)&dg)M_w=cIvm6URaU@00w#x1?H_nrVp6^^HmK zcbHt84p@CFPwo!6{n%r(L5=%`yN8TE{`@#xixxyOaAo2UXT{mC3yS855 zg#7s1CBwjRXz`>YRMo&~Ssoi|QMEg0t?ba?>GW$cv2H2n-^ zzQ&eO!gEvHZlb_e#XC^{#ky*8)V$jzaw{Rq2e*3Zl@6)Cv?OuAF;&lN_T!VT1sspr zLp<^aZ{5Kq|Iz)|A@BVEzzs?8S}72|vAy|+#3}`v?J!tw0AIS#(ApGn~t|c-crp2}iXyRt6u|MLxzj%iH>= zduAEP75f?B`iAxDa^B5vspq(Sb}Ww5r%K_77q0&vPWtL`{6k9?%LvC#*SZU!8Xe1? z$+NV)lPO;en0s0mc0b=Rk-m!dr;E&-3l=*?cAN8$z*+87SW|xg-)^oD66ogQ1!}pW zfGtzJJ~>|iM&CcMJrl)E4v=zq7+QbV14($wDxEasF_qrHRcs@A%7usQ%T@-IUce!m5wL#>-s#B{Qziw2T z9zg5!J9ed`Uo>34O^$oTF_t`bmpzvP=3BuhZbwJfMVr|xs66wJ!0%{zpUsTefx(dU zx}e3>oWLMnFUKJn92|;Dh_m@iB zCY083WTUd5&qu11_pZs7l`9OMjTlGL>YC4T3ah-Xh))3#+^<(Q-06WAb8a+2;6jKw z9NGCMc{x|8sbSptK-9dui>dyd`T;@_R(97xE!HP8iUDD4cn8Ce?1%GHy>d&;%a$>6 z5B-!eTxmhBN_&fBM%#gY*LJ{p;!&!aUxd_0f>;_799d^i-DG5Why}VIg!g+4LYM_} zs-1~r>1XUbgsOjr*zO|cUTrNY-CJNfH)D6uJ@geT^@DTGaG`XMxLZn%!~V-&#C_?mw2XK>)wE%}g-a*319>gXbU zIos}m0$W`er`vJ|SSyo=5pv|-lMFy}H-r{$L*R5}e&?Mop7_PhgTdhjI)Y@?t1}XX z8vi3W;ON zBY3yqR?ykd_W2~yk^4RJcWHb5SA`3)7R$*1?87ir3R0^tj2RSxBTK+L1)J-(9J0^* z0(5N2C#3g`pS)iE`r{f&rP==!!9mzl$b8dT`6BTpCG&_eoNHO#@78x7fowI5t~ls2 zIJnZX$8!Qf+>iffcm4kqmjB<)`uzWL@#HC}(r}&bXRR6ynN}ePmnUJp(Hr&Bcy<{K zwyCq|mb|SEvl3hyLv0`&uunHwe66_P?ZSUt=)Zl@uII)Dsz;O}%U$Xn%Z~o=tRC9;L7GylvlT=B3F*@o^`gk+^g(8>?Hw!?h zOfiS>pd$p~8u(3mBXnhJKjFz5*KqWk&$CT;C-)LxTqnL52rExFS^aJ^N}i37g~X5f z^;=X^?|5v);kLsb;f|mUGIB0&7>Zq9m!5}a;<#q6tECFBmMifd$&KYPo6tuZ#J^`o zSmT)37(Y}J^%8q399hO~)LmieN&019Axp6$mhiShz~>D**Ic)vs9Tc_&91cDjpsWO zk@*#z@!GxYW{E~Tw{;L3qHk8nwA*4bb62PyMywrNdXJmj;B%WZ(Ek`acL-*~E#i5P zw|F&P*uzdO>Y=1Rr@8>rkYFdlY!)p84dI>CbN47==@ezAm_S!ycJaxr-HrN1g@{cvRx|%uSEar(!I)k>I4;*e$szNnv!-5WC>QehoZbTk z+7_Dj!uo!iG-cQ4XmXew_5lQiclU*xhwvhY;Wi%IGC-I`QpF*OB{Da%`g6PaWRmMK zTxOzh#7lBr!EKL;%b0#$i^~}5!=r@hhrR8VMU)h7g(ZfOG5nY?Y|||J@Hh8Icvp(RR;g6FV{+fT63hneL7**Yd;0cK zBjl_ly>qJm_mj^c$(qW=n;YL2Sco8guihPq2L<1gM4_>~mvi8zIGVDJvLUiQlzxky0MUXBkExEbPIoEW=JDe-d6X|e3}8`kYQy=Cbv zBj2Y?w)%r%YU#-kbeICtK0074iT2ORp^5uX@|86c^S2EO(!!KADN37_c>LFZ_~Bw_ zh`&yS-pwSl#bnDle|}o#vSr-gNvy0ypX^Y@Ug^@s`F|YOB=h*28{Wf;dxV>jC1^zd zL>QVkA*rH+zh;V8=hn!cseC3$RGb=5q>J{lfLKn24MEUcEyG$%g0Q>$a2b64$b#m) zndf|_q4n#k{&WsfI6R(#bNb^Q`0!o76X&2PNDoqkmq>Y_f&0BvN$v6Zq+ppp6NnaA zM*h=fb5NLpDhEbmk^tz|MThNMB@ZBU{YtAkX7DOxx38ez{vpawQm#%AG1hZs(Or`6 zd0*Sl6Ot!mxSUjRYY=?|ryDs~7oTooGZrPIKk366Ejz;ffKmyvfi`CDpzXHAXMRjf zcEl8kfi?AA?S4II3kst@-{f_E^C8u{6}@_{S_1yg1#Cf7jka~D-pXh`8cLm{jv zJ+=G8m#;TDi|`)t1C?tP2|#@qLeEVBOM>A6PonT1m z^=W;;`0zwTcM>mseBEyqTas?2S@Sxn971wiFK16pikq<{Y!ZyRNsIIQ9$NaY_1Dwo zlNbI%Cv^4NZM#O$*&C&3`btLIZ$QF;8VRC0_D-lxG1|Acs=siJ2g7xEN^wtBh$4B? zD-}B1ZTV{4QO!M~3{JcH)5VDBy!OZ@32FIoz>NRu&bx}XeoJekCTYRAH2D8hu@&iEK8#6&@}x) z2@~CTyQxjLh$pg&S5<<96MnE7{K+VYJIY7@ zqTUL1i`PA71%`{~eG>y5i3^nQHoarxhC6$gH6fLRFwgm~s~`(2<7dTM8A9>tcuikY zj^F8BXGzXy2Sysqw`ce6=X)KTn%RZQRiKahO!yPVr>jh2y37a3J-1VoZr_Fy+~D)UV{o;nZw<43MYnUi^;$T2Y;gC zcp$Z}`r>$g5dObD)c+R$KUUJt!tG~W_+_rI8OqL*;ppxz#=>H@Ql%lJx~FHSCCwP| zz_S?lKIkj&Pj)AsnxaXwI`2?w!-7sd(77%mFEhZSN+B@7%ce9zApx^ev>#FvE{@?1 ze8b{>e?MYMj4pow&*M6`l)jt2P&a7JJJpU`uLQe3IytU6^Z z9H?a_o1ewL$lU@R13Z$mPg;V&wBU4`_(ts?0h8#FhKP1cL-!n?v|1f!0Da5(H;o?| z))Mh$tqH`@cXs>e0`9e&1GXWkdHU|B5$}vHSh9{cF?yMdt-7Hul;iKL&QNf6@5+2p zH-eVOtllPaLu8kjzafGU6Af|9im4M_^Yu&mD{<%}AV6}Fe=D1w^D(LBY(3p7HM>n} zr#-VTFF)Y&*6(HC9+28V?8Bw>81DWZjKyJ3E#PCP+}6}`@^Eb9-^(sZH)^9=OIg%1 zaqivzR?LdYLQzaC>4;~=$qV4&2Hu#=EK3&>hF~il*oct4ERAUduEx|HZ+J&Bt|pdJ zqzEYOc-D0Nf{@G#U?0M$?~fsF!R&vv^B?_ot!WHguxiR?__XI0z?u=aL#Je3vbJzW z$`v4tdlI5?8ztu?_@@D8--N+$HF|}csE^52PGCv82>#oV*2Y$TJGzyDIMqabdtEsm1-R>%M{l0UbVjC{cu|D_X@a@^&+ zhJ})1Y`k$(Hwyt4j&peE?Z@~zB{}MD8-B@Y(Li#bLeU8@DF_*s9nmxxl~AKvfH#E( zl{C(n92PK^v?e;bxxs&A&nkO7GtAvx!89dwPW{$GKOgSrr^b=0!n8=S9LR~=e+2Q} zY@k#PUxYrE9#K=yeDIW~rdlvfT3cm??1OJ>!h01i-kHj0`?t+#b)+0B={5xiL?^)v zkI(OYfw{2^een?Q*m46Ox(Rd7yKxwCbT`fO!%x|nnAbR>K&Y$BD_e)lW*})!%i%bfbr`3nl%K@gtY-W|PTdeqMfjUQ8uIuXCQnKH^#) z$LC!bjQX@M%^z-LP#vf)4Zbl*uW33v^$$&u_BYoOi02RVGbx=|Sl^hP#wqjnY*uwM zK)wDEkb3mX(K+XIpZuoD$83(6-|d0py%}$h3UNGBOC3Y)C8r(r>-+hbD+jJH%hZFj zm8CbqPu_F$H~E}ffhJ|hrgkmX3f4d#@`&Q*XjGV-{=9zH($h!MR%jiOe|!T=VW4CNJVz_^)$3vPZ?|x1y|GYv5ob0jWnVHrHCW3HanUd+_uIt6Mh!tAnP5 zfRvRmw9DDO;1&aTSyx+v!CKbVr+852gfHVd4aqJa^@?2c)bTz>3k}#3m3tWGU>OmF z=ajWQf?eF4>_{>lJj!qD^*;}azJ`&Gn6Ep2h5P*hhZcXj9Y99+QViu35{m<$ zYIyo?RTN8Q;EbBPGNV;Gml10v;Tu9SlH~4a#T@g9p&q6XC$CDapH}!8n^j$)60&K1 z&Jnc^1dYMDLKYLg6Uu*JsysV302jxi{y3+&o118-&(?P}wq!!gHE)=jxakyi4B?fQ zU*s|csj;m82qHd*yz!zt$wKt>cC*>Dt9)Hs77q7}LIeWnJm#us_zGB}sM1R?`WX3Wgl475&$H}bTwAWEI?zw#fnyT zJYjNpI=O4pkpex!#i?dK6gGB=_u<+g?Xo9(+4SwJk$VR{3n;!O)c&4`ID+EDMxgrqDk=SkM=a?wH0Xkda-A!G%hzU5(~g{Yiojh4p+Z=cdR z_7Oq^?w4C{JUe!mCR8Or0H{Ln26{5{sN9-WGx8NF{R#VN$O@}9G1)bQe)VBeSdUa8c~wDRawmJ zwyepzZJqmP8@jUIiR!LKCPj8~S2={e3}=-{?@!pgod20lKB?0CSA#Qk!7gnx$rD(1zjaHYCcYYz=6HSOzvMU`b$X zY!oR&oa8C~4xU8w52$yuw}BU|R5npVZQLid=zO$87{YUHl^*>tV|M9Vy zLwNKq2gE>5#AJ+#YnR;!pD`KOPgzZ3|ZkYW$0Zz4&l-C zrIFcx@!`tyon}#+)4IbP|B#A)br#3$@f(gb*<`mUCuokPt}MHNH*W z*tI5E?1TY6Zcy_zCKnt$n6e_du?{O3p8-6(9Z2m@o)!Nf6fbPE1Dp)nGGQ&(ys|`u z+)_E|Cdr#83c6M=HJ*0Z)ST zD}k6t1it6Xn9R)gh*AOA^vh-L>`8mxiBIETTpkFhy5-msjJQxIo^#dl;1#mJcdh>N z=5GI*Vv4sWmp^Bo%H|vj(bRNs8)mL}TpD};y}`A!vsHr5QDF#hDt&s5<3EBA8=UnM z9#X$jO~}PxFswR^5#J3j?oe4FyWh%b(A6^}7mjewv|yQT?3YFb*o?F^VdPFrTQc}x zUU|iSO0x1*JU4hTlQ7bz3Y&Ks5Vat9I<8qYeS^x}oj z8$V8@MQ?>gRqyzPs~0!Bq<5%mONHi1ME0%G>m8iG`_%UPy^8tI7~t~kQCO!;u4V=% zDKgB(63tb5+=8(IJ$qQ=SiMC}yD|{1wRo}lCDdMz^6PK9YzeERJ8w;!e@vx~bt9QI`IMK1eX}BF$+(Txh__(*k@QSi)%FVW$B-c(TQy zIWrAvX%1BiHgfggqhp@gD_yC;TWt;wT9T(ic+oA0vF)T!Re09#36u}3_|y4$JNel2 zx5=rW(p|k1+xmw#C0|n9AvP>9Ja0o9;>aMFcep;VRM%}Go+3(PUhT2UQ}C+9%FGu# zRn=@Kal1ZQ4Qyq)Uvnf$xUM%)tA^1I^^LkM6hQ|AKgs`24J=81u0LX{Csv* zIcGwV&Ll?`Ik?ca&NuQ(NooMbMmZT%Z83Gvv?MBCv(<1WK2zgqI-#eVf{w%}o` z`lSh={Bi?Lt%LwqgSH1VH|+E=v0p#cl5w_eQVD$;dDh0pyF7V~-JUdbRXDm2y|79BV+n?l5XWuypOr^gn&p~MN3@iSQQAX>_6sk>< zIR)6Asw*}(;|0jm+Xd;@#V&z)9Y~@rR94M__|0i__{y-0`%>R#r{lfJR_Qw*H8q76 zTRlh}TP#>=@m7p%^`_Y3XEGIeHg1}lcQ#Sm)NlW=ypAnWx>*Jb}H@S`K-Q6${Z&A;Di zYuyBWqMxHW&!xlB?(&*5Hm(9LJfs(hj3?vZ%G|ZryAVRE8+6P;Rlf8E#X0N3Bl&m! z@KbG_3w6YIx-ehtkf~tmXazovpGYDu_DV4p(`Q2xta z?NT_!)yX!`;IDKFHXj3jZTGM)s_B%?Ti0wTLhC*swO!B*;s7}ViyO9W#^4F!epfHg z8WL*~X`65vt*xDA1L&0;!^vf(fsI?qfzY4dY#J%JdwzB$WJ~& z_*doPH@vnL-&Sq*4R+Ga&gA!*_B!Q^I&*q0p3RHhz6Q4Wy8Px)U0)*qqUyG+wf^o) z#&h2Ga$6FI%nTOq{y_ce;{^up(VE$V0Nabx;_f%`{Nu1o=M4l^^ZtN#AiKuIx(;i; zpueYKMC6o(95X&>f8d6yDOea}VeD?g$)p-VSoNyco=8SyI>;s-3Jlwd;IER*NPAbe z3RCp{Rmc$^UgW93dU;@gmGSZ`ej6f)66Npw%|-B>t9A9X*N$nMGb|u+X(o^5kDh*7 zSIPJ0pulr;xfBhT?%{m6L)Eh$$kBW@kmdRmeo0=cm&x+ZS<2_c2ig=Il}w#nI?VJs zUgT@gz8H+0uKG5z8B!_0v@)hD@m?);u9P(h+_b7(b675zJ?lPvM`fEGcYQkOJr~m6 z@J>2SU_*DtK1wPkn=ER_D_kZaWCKaQ_3lro<=Z*E-%7CY(^h{ z*+}RJlU@>glOE|AtL0X`P_7Qn?925(bbL1BcW2+^7m@NLyYTSW(&@`yHkY}k9CaCs z!N%Zo)E5W9a}KKLI-Q`0$DZKy>k=mzMg92TrcfGq-q4>R~^hiDc zpM@)d#=|(I3a#OL8&l!id)Jzbl8F-1AFgUhjAr*|{GKjb1!HBfW{po`AFs zeL!U8(JbkkU6iEGoU~}j4Ghtwarw3VoBltxaQ~f0_^)%|c`9lbUxIAFQ*teI(WtAK zpB|K;y&2tOcAhys{v9R3)&?G4?gY&jjM0{xz9W#Cc3?i;=fc>MztHeBOXXWf?1Uq< zT*DnMCbR))-{|+ z0LU@~zJo{_6eM5A${_dB-D;ee8|~K*hfcV%nUZ@VlRuH5TPd zryA+57xGxuU~zh`DOEbM@#y;JGWV1rgFgf#L@TxKIo>>S4${c(Tl`(dlwq{t=}#+m<-l{N7oy(qR=N>kEL#=h#$hK2)Qt3s4U#nKMVs@IU5$&U2% zKnI_K<5(fvSvN?3@=-Lt!U!RfmtMs?vV3oz_sFho1Y|Q{$o#CW z8l;$}RpfM5Xevqc#YsRR8GhzTs?an~^^lA79<5kCcm>B3zkNVf zkJfJ0gUA8?> zAaS#UW2|9NHU+s`kk1PN>yM3Pf~n;9OV3W#VZ^~we^20(WY@L#UMQbWb$JbG3Y|$k zpHG+cH}#it-tJW2%;gwp_ghH+^_;7hqW+R+(^GysNqggLsDAB`Tv~UnV31sZ<@;9B zyPL4fn?>&FHRFK5O@vRzvKR!IFZ}fa2m~=$Yo=`_J$13?17hV-p{oQE*j+y6K#H5+2X0Y#kdXBihFU4i*Fli65a7NW-mJw9{0K@AXSl zvvGy^L>v2&qg79E-sSao#4A<@I_u|q2$$^9@8)nIXKMRNs!Jg_h|Rz`+*7*6bYTxF z#xP&=P_K+P0hpGAFg`P}Wa$!^JxH&e=#O4)sw>F|}YF{$%sufZx>|FE8K$vWg>PfY z(|IKL2)Nn%{}DiMnG&aJU&%RL#$|Z!b|=9t*2I?Jf3QIr%*9G+bf;ncK9fKteh&S7 ztxy9NC-!BLrd@q5+M7qO*pw|zE{-6PFPjhCXBj@X-0Y^3l&&w!_o603={5oP(B4zO zf_4XLG`>^Q{~h5|{T6xm}NZLfm+h6ZX86v>58iyU6m(UK3c)NopK%iVl zBT#O1zi-~K1hoIlznlFF##FH#qnP^Y-7DU|6DbT|i9E@E56^Z^;`y6#1p0=YCNdp{ zGYHi+pBdIkD<8{nd5?$rJIDX4VE^xqCm|%I2Mi_)jW@?hcPq@^?5Q&dGP_?d$)6M^ z4?pXkMMuM?KKq~(=iVV$%-ZPTMC&5%N=|WK<)5f<{Cr|~1O3e`5M62FmI!e*kbf5<%Ye>Ti8e#*&g(d}7_`*gR?sJpH0A=or@N+V47My7UJSGhL-IIJhKXb5#!44S+rls{A)NVpQ3 zHD4J;@+Y3X5IWlw^~1MUCe7<>4b>2b%lVva)0p!)>G7B9zRI-C7Hg?sq=kC@pKCJj zK}QD{ClEj7#P<^M=sgb1F9TwWC+gJHYtHA9+V;#Yv5aiR_tamqA_{B&@&dzX)h5Tl zpSJCWXl<~28NqHe1L7}nOdZy)O^lqeGhoXUecq$*wyZSqfMVOK^?ly&cARrh&~^o~ zv72KY!PHCc-0@SK60p^GLkff_GExtI`CrQg9c7o*(t=B!7d+#PAAiv#1tGPl(WL{1 z?Qa|HT2!;5>PLDi z^|?bj8?a_JRdv?GfJ>L?H?z;{oM!4TEu_NOGU_blRZU!a$a} z3A&$KQi6@`!!=%sS>_{AHu!|uOrHqND1%XmA z<5%-K93muik8ILRa$pYzYodmUIvk+Ir-p zD5G{!XS$>s`Cr^;kU)0UMs+*&j6``uStT+ZQoIfy*9u`k8uoEF&z|_f8GK#tne}q> z=}N<20epR?v~O-bC~UmPZQ0FpA-nH$yZ#oV%&uBoD*64?2K7pHBnN%xuiyZknM*cd z;^rQP*E$E5~#U!mij~$o}3rPjI75yY0gcWs^j8{?{?;VnHy2;z#ez@ z8D)DdGG}y#!mdN?YC=29R0=G4U&ytSNyzStO`1CfEhH13%{sPle|z}^APCV+Kf)2B z14M&P^DBx1_+5!eKdn~m5S>5lU0J2rxq|4te1wkBwTn_}O`0OrHccP-OPfdXiUM>6 zfea$|NPxZwCNnxUPXl*2@LEdh%A@+?keAWJb>(~2()mVT|0B>zpQ^bbRjuVvZplJxUO)&B@#L1K@>u3hp79N|7wI3$I`$%w zH*z-KIum@lhmVeR44D3L@Fqpe{2u|N6`ZpLpg3U2_n70e3U_s*`VvmkQp_C-bEq{; z=7*&oAN6jg<~q^R}guG;h-R;DvX*= z0l|)Avou9SRSHIjD6ksP0GFH}$*0ywa5~rL3n)9k8LpG ze?X?H=oF}lT!i40=ssq#nvNox%CVYNxg0uNM*T1)vW0-LDM#0yALna5jsXv$s|&EM zh^ZKyh>;n{a1fQv9p5e0nH^PJGFV;FUz%`#V=Tj{Q_{MpBT7B(0r%3LiuCq*D}lkc zn@eQ+e(ZprcPg&>Z@a&2P==~n`r1qPb!GTGfTGieJ0f+cy_4YyBL}%#y#4xcnR#iV z*Q6x=MYT2OgUn$cL!OAYZC9HBDF3!(ikk>7yIZHH1Xn8^JZ|~ys(hX8uSY^4aH2w- zji>BAKJ|Emy9T*BzZ^5ZhH@qlZXz3HvN)G4i1bSjE1R;G&)d^KnO$$i% zMslgoNU85tOt4mvN{J+rZs`PP^HqH3p123S#4GY{`{p}eWHvKM@?WNTlN(b6w`U}i z8S-kq+D;_dw*-QY`jgS71CN}9^7P-(t+EQ7crvMy0Df+sQHGvw6Y_N`_*o~`iJ1Mq zlbn8!oYl6OV9E^IFZaj~eF+cwX3k}FM*~^2VAFag11{;_?>AEt#3doPlJsU{mZ*7Ie2CYHZ6-iQCc%>X5+%nkv11=9*n*G}j{6q|Fl>D3O|ZAXmBQ0vU*i!*u>j+QgKZ@`8al{pMEkI z?^=U@9%mMi^XbI|vc>FD4fBS@mG@Bp6*EWe?rqY~1UccA1X2<4@a?}&I7S3oa=qBC z{O5|5jgu>cWP(#*!8>}&N$PXLLf!TDgSw0NV=mm>JRK_@DLp#|*)F&A z<4*N!uE$ZiM{0U>xkTTNdeNEv;4545kZ>8B^ zt!|fWp{mi_)dcQPFO_cXM{(VLl-7Vby1H#HG$w%Y#`)yPIK738^?4J8JB$+9I!_&; zr-kW{!xbfIZOg}YJ(9bL?&uyaq-vN~n)|n1Ei~0D7Pb#XE-*e7X|q>kqjg9j(QHaC zbNUkC_~>s)ifuUwKJS>~qHrktG*Xss6=XdO`<&_jlKlmeJ!dOHoE)U%q_|hP7h_@T z^sw;Dl}1Ld?8pDBu(JwkvwgHZ6pB-v;?QEn-M#(LAcYnSR@{oa1qu{saHn{2clQ)` z4;I{=ph3T#|C~8sjl!7BtHc9D`H=oxPES_$gGomg$1L9C+nQ zxc(VoSgSFOlR83H&jqs%$lrj#XlY30P{Col4C7vw>-i(m7|A<+iy(q#->Y9NDIb9f ztgNg;M<%518l=l>EX5W2_vDc1I`KB8yniSy%|e4<7jNFkP+fvwer@1|69kW%8Y$j2 zlI@&>szyhKkD9w)j3p06l?PNN$BdYe=~kmj4_ioE9N@#r7}=M9QRFnwO*9bH#@*n} zqF%NAqQwyB!l3PD6GIQma}yEU2miLvq7OrccnQ9`bwa_&n?!SQ+R0_3_qtZHa=M=m z=giS6{WZXmDCL^&K<#-Xq`J7wsoTI~p=MKr(v3U3%-)ymgs3;5Y^YwvVpP~0_L3!$ zNl@sxvT_JTWywl7%yc7UFpo8MmOCAgccVIM>v}&uUF8XJ{8-OBDuY@44H@7pr$eeW zW3S+WEz(DEr@rxePpr>n5(!Ehx;uBecN%gklDA>aqJfx8hazu%tNXb00?MpATWT8< zl))9kQ_0GVN)Q|YLABOo*F~eg4c($6Abog;eZFFT1prs!#VH;0T=pC4^6DThR=@W^ z@@7P3W3<+SmSTO%<=(NjG6{i`3#I#~=H$!e4^K&P6g^hdKjKpC9^R^7T-wg``w$D? zQo6h|z3U{s5P!g1Frun2)c#t`Qc!8tJ^5$)!^jsG`_;O~?&?G8CgB?WWkn|poV=ey z=P~>)hCKa7YJ!vKM)eq6!i#a$R_1frs~k08>I`N5y7=W>CibYDfm%roy3{Qh?Db`d z;IOx58q_M$J+}u6_Vt|Q>Y^h8Rn>GhP3`67sbBO&D`{gx4)QwP{=VSWEnHKVrvxUf zNo~fvy>pxTX0aWNAE*q+Br?4Oe?8iI53}SpB40LsZaDSp%Ag}wYiArfUVM4$t)U8k z9ab9PifC<&@?kp~lcjiamZ7)1yuXe-DD<8Yb}l|gg|^AOnk-wkw_EoA?!SHO04q^U zA`JJEbsKtcF*YHY53@{Ic=+l5JkLdU4APx<<4RmTct}>Ovh;BGeK>l^2~NNI7?H0Q z-(7Jg5Uu8HrVI&wbz`2L>HDCqHQnKOnSzY;)AiBpOI^)WWHOGF(`Q#42~%6hfHmCr)7Lk6+U%H-Ee@s|8%h|*z>Mrc1vYOfMYV)UqB70JM32GyXHMt-AA`3p_C# z3X>Mj4owNeMzb9pH;~jGn!>2w)b9S1|5cDUJ*d0V?RwW}Noa1l$YQM)nDg)KOFrFx zzrBxJz;mk)MT?H^5=WJ8(d-pX5H{Ifop(kb;RyM{mo|$i2ZbwI^)*p6mmcIhTIOPM z;9aR5zueYT%_nivRr1pi>AoiEy!KNPgNp*;e^HjReSPA^%W@?~%Q2Xno%1mrF%3zy z({}X3Of+ZuwLoh2Zx0rp#O`nDDau&xo1_mAGVsK|bZ7{BOU$UVs`MB8-{_F}T}!+k z45o_`(inlvkRUZ*dSnl18Mn6^$DO%_xFS^~?l%|C=6qeNjws^}Q%q>eJ}owV0!SKB zRHxpQuJubeDzoV`$$FH<_GLBMf+V045u>!O*J2yWPAtS4syT(as0+Qgdu?7@`}4cT z*`dr6b~W?<>PqMD`7ghiRWb@mGZX4gy2pMVWKsd@5Gcx&rA*F7Jb{Hs_=v^rK*s!ovJ$+hbL9|Zn?pE)Y0 zpD4?Z>sERT(u#fR^vUJYdXNmVVj6hPBzU*q+{QG2(%6opecEficyiXIr0FE~GeTfP z&x38H?_o^Zf@t@fB0Wd<$3>}+w|5U(FEhrkG$PlL@*_$b&s(Ag8c3{qb%+ccV%>~i z%+PJ&`u$8Wsa?Z}Hth(FZF~a^yT=L=pX!tLP1F zKzVtr_JSZinx3A`JNmCsZs}3;{dZrZVFC>?sIQ@-(>nul{;$!konIWbB=@Of207*3 zw<+x@*5yf;fvm^XMh<^Ykort~`YW{D6Qqiq;KJ;-Kd1Gln|s2CC(6%Dsv-T*Es-$E zPv#r+)QE7U7I;zXW~KPdp%90}Xhe~LUyFH1%9@{&RWaGikJM z5acApq_7H*>J#f`4uZM*bdsQ#9t@Q3&NDXj?(AUPG7`ShuA|ZddQWWYbb#&6xen%l zNCO@JuTX!3iS?oxYkcfFz=frpP5kF%N_@#^>xSqLK1p;Fq7!P%yO?Ye(HA%0CY>m=8W-8lISisIuNtWp1iLK z8Hr7i@qS2OnLXR7Ytzqn4MDU_D9(0rXGqOgo_LYlQT-!^5*2bomu$ReBE6*?e6rTx z6tg77aX(8LRSB--RPzy2S3m7OJ~JZv+pth-b*I^ypxfBcQ}0T{_6TYJahmR#`#8qq+rtfLbhP~NQnLF?cbo`(y`4n^p1(es6 z16KEdBQnszEF`BSy0R(5XNw-+NNBvVb&YU9c2RkPCR2Fr$-N4>xg`MY_%K8Jp@>=vOlSgGsw`8!h0-l0@K=kwHGts2F-T58EwO zV=Bt(=D2q>xA6rWpVA1s4lt*lF25{Q*>c8 zZC1^%nuoA5GVEL*8w!_7P2`k6mkkKkQ=>%4y5{k>E6iRW1q2*RJgV>5hAUGLQA*AZ zGS~i?Y`&=;+138&ddpR^x-#=%xc^gL{m@a6N`_W#y@*bwK01QvgQg+&H6Al7%243CcD;_fo8} z>ufc7+XSp>pqORA zC7+dl>3Jx%EGtvUFcY!IvBYAPy%fQ}|6K(>v&<;C`b*EB8ftl4yJhu1e~yT4eG9DE zwgz@tMTaIeAx|8_dC7WTgG<$l$*a=m1#fMmi?Wa#Ze(W2Lf!vCz_TmmrTFMzk+!#@ zYAYzS){s>@6=!G&2k5Y9;?(lhun(eTzY*6>&e#_}PwwFM^M7AVU7ukLc&eJR^x_q6+m{x~x%r-^wW5hLKGKIv%*vMREhsC>X;l z`j?sW*Fe7?!>lYV=cGr*3^Px-wr-UMqf&jojiHq^WuLYr(z@hn2q*aSVOw3EiH5L< zqh8TR4NJ1>FKuwv(CcRfW)h>yx_2DJEN>`+^jap6_d_JH105W|nJPgw9V32EeaV_a zqc_?ic)>ESq{EQM1ILtw%23Q? z4R$``T=&R$;pWH&98(tB0>v}E%h;7i_~z+Z5MBc^*e?{IRpb;Phy^q?3taM+hSK_} z)y(nqkoyLLZ-{KtEiOmanO>i!YBqv(*(Fz!qG)G6$e1I`KBkgh7hb@N!Csz_hk(_r zyM917m5uL0SY_b0mm{oEAn_J>8&s|WX~tjf8( zVlZDwOuumjYP&R=rhW!wdnq?t*8655IG;a5Bw6d*=UHcs|3&dxv8U=)Hy$CB?AT~_ z1Med}s^ZJ-OdH%e4hui6b`RZO#~NG^gm;K|**Qsma_3s{{?N{^@<``$ zQ+3{VOQlv7Zsw5Vz7+Qka=*E@qM;50VYJ4E!4J}Z!qED#nNn)y1QR&_!FZ2u&0vid z*K)kpWqaXt`X~Phh(Ij^L60v2`(D(SR#wM<5uoC$D+H$OZRUvT* zWA2sYk6>qshj|RQJrp^KIyazh*EQd(^D7;XM5DT(HH9FnJ z`1BSYQ@f#ow}NQy&8C4{_Zbl=L)|B_O^!d)>WUXOxD}{G5v?sClfTz2KI+_D z)fU$$kxlS`bOAhzlM^Y-LgzNJ(u>q6rYZOBroqo(z_E7{@{2XpigV@?Y%1e{k1!R9 z>9$G`PPduQY5rc@0K{Dt$9^|QK7LC1Uh7jC|7gqb z5F?Hp`ib|)wTB14Zi-{V#>Rm>MkNN9#?6LEWQ#v=Qo-8VF~bX8Y$dUZdEPBqlLjIrm?ui18W#Evhb8;Cc^ zl2bflJSP||BM|j=gLh}+;tjt~k-?-XU4|R!^jV8*FzfyS3lP>$c1pI0Zc0p>bQv50wMZ!f@7G40>W(lbu(63s zTqacF0s`6R;TjP4$0mO!Y5udTF74jtL?R;IaroOWL5*PXU z{t>9-xY}}C3Y&Y!vVnX>XV(IKDA$}`7}OD;nB7_WBJ!4M@CS*`j9JSZ*OmDDTppTjG#m6Y2{{nlKQe-0iSV{DcAz@8jr>&}m-&WPsp2Hs;C_Gy;6N za8F;$TKcnzwh`}(99MFVOM=YYVhEgmpKsSg>+>Rf_`gt0sMrOLtgzP z@Sou>)I9xhx>WnT71+|>R5t_e-&pM}KDg>||3|DZDUh^{qAXYx+fE~CYv$~|lT*${ zph7m~g5avPQmpQ*qx7^ne?^?y6L)kRmZQKB!_F%L%y@OEqt4^l)TYs%%@7m)AboP6 zwBl_y@*%>#%Qs^qr5ONl6&@@*X$%CHEu8GM0T-X;P95sObIK*B<3j;qGUchRI-0zgJXcF?deKS#y^^oH_!kS3R&u-w* z)s-auJllY}uG-3t*2g6+z!jX@aPn*k@&0WG(kb*MU*PgDI6K z#SG9+=fm3ikiH?Q#0Tm+kojF*bTN};ojvRN$d_o`)V#BFX`~K9Hr5ZdVhs_xOirNN z*-;u?PF>z#R$D^0o8EJ^kRDhsD~(mRh&!@T(;X^Fi~R3igJYibZvdPK^!?4@iop&I zY8u7?I`HemGmK&RsmJ>Cm%>;B zS-PwcUdV@DMONmzEzZMDupB%BF;~1(drfe<*bqE=tzjp5hIYo>KfkEI*F^Doudu#X zk77Rjx0a<_(fySC(V#P75)jLs+cog*4e9{D%cM}v8Y=vi+-;;1bdw_U-eEc%{o9XB znizg5evbX^v|-3&+q(Ly(*s?ocOn^=wovCoPI?ZpjA`t$(|`$~Bwpm!B(4#{`tOy$ zKu7dj!}LA_dMt?jn?HCdF8V%RGo$PPuFloI`xwc8%5vdr-qbJHla)4f)CiwkM5@un z#BYxR_k_bFu&bc)@;0r3Yw1CsI(b+PJeEv;XcZv-WCA$rH$tpRxldA{+CO6Eu-Sf^@s8W(RX9wl45v;*sqvs=(fM(uC%5l^Ul7eK=BKsR3War6nM2#()~5_T#a}Y`Z{RLYA$!;WDDWf91g6?i%?;+ z4`vb3VIMR<#>h%U4CciIwDvX6WzT3zUM%AI~-})G^+8W8}_O-0aV8C4O#A;7I;8o#^iRYEVKy;+OO{zPMa& z@BPxJvm_TW9kXgnour4Os+_G3B)pSH$J~}AAY2RA8Ru+-=9ZxT5Vk9(5IDmr2KXaWglwVz6$|Q4>AG5D#FW zu?%w+lREm|KXO;wsG1=E3((p_t5ImBSYkBPOYTasrUgD4QW$f2cOO2YA~yO+W@0X&7E?cRQ*GK`75lCIb5{{{l~HX zwWj`b=pU>B*F9Ui$NK}}n<=D+Kc!gi{b|c7+I^+m9@jxGFN{gAt|Z$!DKuHF--|zF zS}*yw-|wlL=t;ZMwnh)3Nr$V(IFhw)Mp5bd0<0@qEn6vg96=r4Zl$MMBsW+DbMLL8 z&=o8!&=ZhJN|~0}-1(+1zdriK?O=vE`aBH7-7huV@TL2GZ1U4PBXzbgy4aXlb1%9g zIm5QSQ%Za75%{pujcZ(=$|?a^IBV)o{RHFcP_F3Un^>^&c?0$Nt?NHVGP?S1aKe+u ze`y3OgU zgD7|QK0T%0>t>iBW&!Zmu)}vO%QjS!`>0H^D!kiL>R8(hTitx+T5G2hPdaS1kb-31qHM&9t=YCn0gu@BW1T$BuR<|@(ZTd0b!usj6eY&&uzH9jvtN2K*pw*qEQ0?NuR8snb#-8eZ-auIgDmYR( zX4y!EqRO$Wzuk?gfFw-ad(ii4lK$Y%m=TfxHvHx|-mlm;#cWS+HIf-t&r4WKc@HI` zPN1mUlNTM*dZ*rCTjf`9qtVt5^qLns$}x{gG5vMR{U*QJ@A$>{TB><-VZe#fp6<;| z0bG6=rr}YvGUy^XH30m230Y!b8`+H^jUrH)fO|aOc2^jB$DCrI6Y|J^YD%<&_hD6b0vmx_UsPlQe6MUW{|Gulx3&CL%NhGq2;#bG zeG{2f*@QPt3x~X4D=!!I*nL%v$zZV~g6@GCGSkV;2)Ss&eJ$F;F{cyDT*y%_QCtRG zKJC;^?mq{ts{98Yu~3SiQeI#m-=HH7(pfs-vqxgR6G@IGDmj|=F*BU4SV zJh4$h8LiW=@jT4YpOibdsTGXP8e;lQ+PeTI+~G~h#Ql`NYk=ZkW+3^A30EeKm$vJ( zh8CvK{hC~Vq{uX~G^#8iY4xPZNRZd-$l9jPr_Dmk=NGq^|1^G?kJM|uj!y6ZA14Hy z82r_mzNF0e`=4s3Z@(7%@xVWDUVn7}_pwpHiW%;Di3JwFm-EMsI4geS$idf2;!yC| zoP1OE)NI`3`54YM@>W<*a`7;=~UUL2Wn*&lIItEao{)&oV36m zS*D1y1sXNZt{WK0(_E5U#ec>$d-Nif9iHf)teQSx--$0MnO6Ce`~#gRPVU4eK^`o? z=#Iwn+euQFmw61YD&d2rr9@Kc4xu7C)o6lY$FnebL0MTDnF7iNs`>=mhZ3Ukr6Y1+ zOcSM?GWnvQ>0*AJ(z>weciv@fg)K~0+OnI2EDv1U)3kQexc(0I?`DOWQN$|dxG|?8 zL9PPdZvs#8b(WP@Q?NJUH*wII4*ctwhIT#oDMTlZ<~y5RJTUUnZO*aW&D=T^5KP<> z3FSyp*=R7GE=48tKfxHP%I*NO-z8Q5bSw;WD#6^pd z4=}&z{<}b>8&){S%HAx(@z^9Lq1hwKa4ojo>7QjBvKbrUI~jhmJ1gQ8_7$rFbZvO^ z<$A-{6H*a&+3van|nfbcc-DvyL+b_*5Q3@5nD!hRSypytSM~ z=}Y?k;oBdsxoEpq(JK~6-rD95jF%=p;L>OR_o*x)qK z+Wx|d?`E#kOyS>cOv0=f$R*zdxjKtdzFQ-i>M%}!hSqN#m;3#F5AYLij_OZx%2u#o zZrZ&7x98vl?Q_m28z=r*KWm8I@K=g#*e=z-zhc&@4v4IL-x{qy;X?ZOH4P#?CvuhM>yt(D|zx<4=j8^Jz zQ`b4A5WBVHu#v5(>D1co!=|oRw$D^D;28oL?)O-uhCcCZaij^Z(jD?>Ei?OdpA2`* zzf0nG(%v;Fa^-i$59G7*rcuWwlayuy!JR5^e9x+~V;`&o#9SLTkZT;3*S^gK2MX%FZo z%fyn_PUY6jv1^8CXmh!{>dgBVH;op5p;6VAkhg2@HaV^_0xXiM5#D{OPFj1Mby+(VSS-tEBsKknaP6Bn<^JsY~20wqDh$M$6iomyE*_}5Is`G34 z4W+qZq7^g4C+U_x%TghB?ZSov@7P-EiGA){C9jO|L&LQ@>F8@30vl=SU=rU$<1mLO z-Qwg>Vz7>|Xl~ZxpUX+14-HXMBjy}5s?!u>7Q&zY=rT2n4N;(&S2-c-A#mFlGB6h8 z(%jEVFP{OBwrXN`&dB6&^yZ9Ttlw6-P>7|vs=RnF=ccvdJ(6L{pNRMqop*4nhIchA zX2NCYz(chBFG>e$i(Gr`XGP!*ZZ+|!QxO3UVx$kk@R8Ff%k3R*+$gebGdLCH+EV=? z^&jZ>#;+-6f5lK7`ZkhiQR%}t9QT%S`!$*r>Ov=0w>|lBGOZWmubI56y<{M!yz{1< zv^En$?+b07Q|=1DAE3yO-FKrLww@5?lK>f7JXMIH z#n`>uT;*XC{##!XAvm4Gu8c0@E}_`$8kLju)Da)$qIU5dN=~TSq_edQRTk+f>-iH^ z7Bp0TnOBP*B>sGc&ETXvDPsL6!_!lNclxPhO#)CJQBM)A{x1q|(c1PHLCOtR=In}! z0Qp-l0o9*>JU%sk6l4;Xlh^Vh#C@f7fAwJtzZDe# literal 0 HcmV?d00001