From cf9e4d384a90b571844734220877a859c5621c74 Mon Sep 17 00:00:00 2001 From: wildscotsmen Date: Fri, 21 Sep 2018 15:11:52 -0400 Subject: [PATCH 01/17] Updated application to include report page and also added basic component for report form. --- src/components/Main.js | 11 +- src/components/ReportForm.js | 210 +++++++++++++++++++++++++++++++++++ src/pages/Report.js | 15 +++ 3 files changed, 232 insertions(+), 4 deletions(-) create mode 100644 src/components/ReportForm.js create mode 100644 src/pages/Report.js diff --git a/src/components/Main.js b/src/components/Main.js index df578c0..cba1468 100644 --- a/src/components/Main.js +++ b/src/components/Main.js @@ -9,6 +9,7 @@ import Home from '../pages/Home'; import Map from '../pages/Map'; import Quiz from '../pages/Quiz'; import Sighting from '../pages/Sighting'; +import Report from '../pages/Report'; import Info from '../pages/Info'; function TabContainer(props) { @@ -48,6 +49,7 @@ class SimpleTabs extends React.Component { + @@ -55,10 +57,11 @@ class SimpleTabs extends React.Component { {value === 0 && } - {value === 1 && } - {value === 2 && } - {value === 3 && } - {value === 4 && } + {value === 1 && } + {value === 2 && } + {value === 3 && } + {value === 4 && } + {value === 5 && } ); } diff --git a/src/components/ReportForm.js b/src/components/ReportForm.js new file mode 100644 index 0000000..cab0f04 --- /dev/null +++ b/src/components/ReportForm.js @@ -0,0 +1,210 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +// import classNames from 'classnames'; +import { withStyles } from '@material-ui/core/styles'; +import MenuItem from '@material-ui/core/MenuItem'; +import TextField from '@material-ui/core/TextField'; + +const styles = theme => ({ + container: { + display: 'flex', + flexWrap: 'wrap', + }, + textField: { + marginLeft: theme.spacing.unit, + marginRight: theme.spacing.unit, + marginTop: theme.spacing.unit, + }, + dense: { + marginTop: 30, + }, + menu: { + width: 200, + }, +}); + +function formatDate(date) { + var d = new Date(date), + month = '' + (d.getMonth() + 1), + day = '' + d.getDate(), + year = d.getFullYear(); + + if (month.length < 2) month = '0' + month; + if (day.length < 2) day = '0' + day; + + return [year, month, day].join('-'); +} + +/** + * Types of sightings. Label is what is + * viewed in the application, value is + * what is stored in the database. +*/ +const sightingTypes = [ + { + value: 'visual', + label: 'Visual', + }, + { + value: 'roadkill', + label: 'Roadkill', + }, + { + value: 'trapped', + label: 'Trapped', + }, + { + value: 'viewed_tracks', + label: 'Viewed Tracks', + }, + { + value: 'photo', + label: 'Photo', + }, + { + value: 'other', + label: 'Other', + }, +]; + +/** + * Levels of confidence. Label is what is + * viewed in the application, value is + * what is stored in the database. +*/ +const confidenceLevels = [ + { + value: '1', + label: '1 - Strongly unconfident', + }, + { + value: '2', + label: '2 - Unconfident', + }, + { + value: '3', + label: '3 - Somewhat confident', + }, + { + value: '4', + label: '4 - Confident', + }, + { + value: '5', + label: '5 - Very confident', + }, + ]; + +class ReportForm extends React.Component { + state = { + date: formatDate(new Date()), + time: '00:00', + multiline: 'Controlled', + type: '', + confidence: '' + }; + + handleChange = name => event => { + this.setState({ + [name]: event.target.value, + }); + }; + + render() { + const { classes } = this.props; + + return ( +
+ + {sightingTypes.map(option => ( + + {option.label} + + ))} + + + + {confidenceLevels.map(option => ( + + {option.label} + + ))} + + + + + + + + ); + } +} + +ReportForm.propTypes = { + classes: PropTypes.object.isRequired, +}; + +export default withStyles(styles)(ReportForm); \ No newline at end of file diff --git a/src/pages/Report.js b/src/pages/Report.js new file mode 100644 index 0000000..3a46a74 --- /dev/null +++ b/src/pages/Report.js @@ -0,0 +1,15 @@ +import React, { Component } from 'react'; +import ReportForm from '../components/ReportForm'; +import Typography from '@material-ui/core/Typography'; + +class Report extends Component { + render() { + return ( + + + + ); + } +} + +export default Report; From c22bcae00d85a6b4e14e4dcdebe6c97a7a509b02 Mon Sep 17 00:00:00 2001 From: wildscotsmen Date: Fri, 21 Sep 2018 16:38:20 -0400 Subject: [PATCH 02/17] Improved layout of form. Actually got data sending over a GET form method. --- src/components/ReportForm.js | 231 ++++++++++++++++++++++------------- src/pages/Report.js | 2 +- 2 files changed, 147 insertions(+), 86 deletions(-) diff --git a/src/components/ReportForm.js b/src/components/ReportForm.js index cab0f04..b380827 100644 --- a/src/components/ReportForm.js +++ b/src/components/ReportForm.js @@ -1,19 +1,31 @@ import React from 'react'; import PropTypes from 'prop-types'; -// import classNames from 'classnames'; +import Grid from '@material-ui/core/Grid'; import { withStyles } from '@material-ui/core/styles'; import MenuItem from '@material-ui/core/MenuItem'; import TextField from '@material-ui/core/TextField'; +import Button from '@material-ui/core/Button'; +/** + * Styles that the different + * Material UI components pull + * in. Mostly used for spacing. + */ const styles = theme => ({ container: { display: 'flex', flexWrap: 'wrap', }, textField: { - marginLeft: theme.spacing.unit, + marginLeft: theme.spacing.unit * 2, marginRight: theme.spacing.unit, - marginTop: theme.spacing.unit, + marginTop: theme.spacing.unit * 2, + flexBasis: 280, + }, + button: { + marginLeft: theme.spacing.unit * 2, + marginRight: theme.spacing.unit, + marginTop: theme.spacing.unit * 2, }, dense: { marginTop: 30, @@ -23,6 +35,14 @@ const styles = theme => ({ }, }); +/** + * Function for formatting the + * date as a string that + * Material UI can use. We'll + * also store the date like + * this string in the database. + * @param {*} date, Date passed in. + */ function formatDate(date) { var d = new Date(date), month = '' + (d.getMonth() + 1), @@ -95,109 +115,150 @@ const confidenceLevels = [ }, ]; +/** + * The form compnent. + */ class ReportForm extends React.Component { + /** + * State of form components. + */ state = { date: formatDate(new Date()), time: '00:00', - multiline: 'Controlled', type: '', confidence: '' }; + /** + * Handles state change in form + * components. + */ handleChange = name => event => { this.setState({ [name]: event.target.value, }); }; + /** + * The render method for this component. + */ render() { const { classes } = this.props; + /** + * The actual form. + */ return ( -
- - {sightingTypes.map(option => ( - - {option.label} - - ))} - + + + + + {sightingTypes.map(option => ( + + {option.label} + + ))} + + - - {confidenceLevels.map(option => ( - - {option.label} - - ))} - + + + {confidenceLevels.map(option => ( + + {option.label} + + ))} + + - + + + - - + + + + + + + + + + + +
); } diff --git a/src/pages/Report.js b/src/pages/Report.js index 3a46a74..8a7909d 100644 --- a/src/pages/Report.js +++ b/src/pages/Report.js @@ -5,7 +5,7 @@ import Typography from '@material-ui/core/Typography'; class Report extends Component { render() { return ( - + ); From 2a402407ae2071f24e391adebe1a52800348802b Mon Sep 17 00:00:00 2001 From: wildscotsmen Date: Fri, 21 Sep 2018 17:19:56 -0400 Subject: [PATCH 03/17] Added proper form validation for description field. --- src/components/ReportForm.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/ReportForm.js b/src/components/ReportForm.js index b380827..793928a 100644 --- a/src/components/ReportForm.js +++ b/src/components/ReportForm.js @@ -125,8 +125,8 @@ class ReportForm extends React.Component { state = { date: formatDate(new Date()), time: '00:00', - type: '', - confidence: '' + type: 'visual', + confidence: '1' }; /** @@ -149,7 +149,7 @@ class ReportForm extends React.Component { * The actual form. */ return ( -
+ Date: Fri, 21 Sep 2018 17:24:40 -0400 Subject: [PATCH 04/17] Fixed spacing issues between desktop and mobile. --- src/components/ReportForm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ReportForm.js b/src/components/ReportForm.js index 793928a..6fd3be1 100644 --- a/src/components/ReportForm.js +++ b/src/components/ReportForm.js @@ -151,7 +151,7 @@ class ReportForm extends React.Component { return ( - + - + Date: Sun, 23 Sep 2018 19:37:35 -0400 Subject: [PATCH 05/17] Got the form to send data to Firebase. Still needs a toast or something to tell the user the data was sent. --- package.json | 1 + src/components/ReportForm.js | 50 ++++++++++++++++++++++++++++++++---- src/firebase.js | 14 ++++++++++ 3 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 src/firebase.js diff --git a/package.json b/package.json index c7c5f72..7a7448a 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "dependencies": { "@material-ui/core": "^3.1.0", + "firebase": "^5.5.1", "react": "^16.5.1", "react-dom": "^16.5.1", "react-router": "^4.3.1", diff --git a/src/components/ReportForm.js b/src/components/ReportForm.js index 6fd3be1..4dd046e 100644 --- a/src/components/ReportForm.js +++ b/src/components/ReportForm.js @@ -5,6 +5,7 @@ import { withStyles } from '@material-ui/core/styles'; import MenuItem from '@material-ui/core/MenuItem'; import TextField from '@material-ui/core/TextField'; import Button from '@material-ui/core/Button'; +import firebase from '../firebase.js'; /** * Styles that the different @@ -116,9 +117,19 @@ const confidenceLevels = [ ]; /** - * The form compnent. + * The form component. */ class ReportForm extends React.Component { + /** + * Component contructor. Currently + * only used to bind event + * handlers. + */ + constructor() { + super(); + this.handleSubmit = this.handleSubmit.bind(this); + } + /** * State of form components. */ @@ -126,7 +137,8 @@ class ReportForm extends React.Component { date: formatDate(new Date()), time: '00:00', type: 'visual', - confidence: '1' + confidence: '1', + desc: '' }; /** @@ -139,6 +151,33 @@ class ReportForm extends React.Component { }); }; + /** + * Event listener for form. + * When the form is submitted, + * this function passes the + * data along to Firebase. + */ + handleSubmit(e) { + e.preventDefault(); + const sightingsRef = firebase.database().ref('sightings'); + const sighting = { + type: this.state.type, + confidence: this.state.confidence, + date: this.state.date, + time: this.state.time, + desc: this.state.desc + } + sightingsRef.push(sighting); + this.setState({ + date: formatDate(new Date()), + time: '00:00', + type: 'visual', + confidence: '1', + desc: '' + }); + }; + + /** * The render method for this component. */ @@ -149,7 +188,7 @@ class ReportForm extends React.Component { * The actual form. */ return ( - + ); - } + } } ReportForm.propTypes = { diff --git a/src/firebase.js b/src/firebase.js new file mode 100644 index 0000000..f26bb7a --- /dev/null +++ b/src/firebase.js @@ -0,0 +1,14 @@ +import firebase from 'firebase/app'; +import 'firebase/database'; + +const config = { + apiKey: "AIzaSyAYf9AbeYwLY892NRiQfn0AMtG9xIFAJbo", + authDomain: "marten-application.firebaseapp.com", + databaseURL: "https://marten-application.firebaseio.com", + projectId: "marten-application", + storageBucket: "marten-application.appspot.com", + messagingSenderId: "659856510832" +}; + +firebase.initializeApp(config); +export default firebase; \ No newline at end of file From 56972690ccd1b4722ad55da574e4af9d6c1f5ab5 Mon Sep 17 00:00:00 2001 From: Al Duncanson Date: Mon, 24 Sep 2018 14:41:32 -0400 Subject: [PATCH 06/17] added Google Maps API key, unencrypted temporarily --- public/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/public/index.html b/public/index.html index 52bcf5f..4b4d08c 100644 --- a/public/index.html +++ b/public/index.html @@ -20,6 +20,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> + React App From aeae021f2be91fc265c855799f189daa8f9cbb44 Mon Sep 17 00:00:00 2001 From: Al Duncanson Date: Mon, 24 Sep 2018 14:42:41 -0400 Subject: [PATCH 07/17] added google-map-react component, added geolocation --- package-lock.json | 50 ++++++++++++++++++++++----------- src/components/Main.js | 40 +++++++++++++------------- src/pages/Map.js | 64 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 109 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5fd399..39f42a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,11 @@ } } }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=" + }, "@material-ui/core": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.1.0.tgz", @@ -4121,13 +4126,11 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "optional": true + "bundled": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4140,18 +4143,15 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "optional": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "core-util-is": { "version": "1.0.2", @@ -4254,8 +4254,7 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "optional": true + "bundled": true }, "ini": { "version": "1.3.5", @@ -4265,7 +4264,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4278,7 +4276,6 @@ "minimatch": { "version": "3.0.4", "bundled": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4378,8 +4375,7 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "optional": true + "bundled": true }, "object-assign": { "version": "4.1.1", @@ -4389,7 +4385,6 @@ "once": { "version": "1.4.0", "bundled": true, - "optional": true, "requires": { "wrappy": "1" } @@ -4495,7 +4490,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4675,6 +4669,23 @@ "pinkie-promise": "^2.0.0" } }, + "google-map-react": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/google-map-react/-/google-map-react-1.0.8.tgz", + "integrity": "sha512-M1UIXrxUhwMjNiUkw9DiVSO0fh7vZOxgGR02grzPOu4S47sYV25oeHcsK32rvGuNlBwpHHS+T9AV4aiRuKNXuw==", + "requires": { + "@mapbox/point-geometry": "^0.1.0", + "eventemitter3": "^1.1.0", + "scriptjs": "^2.5.7" + }, + "dependencies": { + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" + } + } + }, "got": { "version": "6.7.1", "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -9708,6 +9719,11 @@ "ajv": "^5.0.0" } }, + "scriptjs": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/scriptjs/-/scriptjs-2.5.8.tgz", + "integrity": "sha1-0MQ5VcLmutM7bk7fe1O4llqnyl8=" + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", diff --git a/src/components/Main.js b/src/components/Main.js index df578c0..1f3d080 100644 --- a/src/components/Main.js +++ b/src/components/Main.js @@ -40,27 +40,27 @@ class SimpleTabs extends React.Component { }; render() { - const { classes } = this.props; - const { value } = this.state; + const { classes } = this.props; + const { value } = this.state; - return ( -
- - - - - - - - - - {value === 0 && } - {value === 1 && } - {value === 2 && } - {value === 3 && } - {value === 4 && } -
- ); + return ( +
+ + + + + + + + + + {value === 0 && } + {value === 1 && } + {value === 2 && } + {value === 3 && } + {value === 4 && } +
+ ); } } diff --git a/src/pages/Map.js b/src/pages/Map.js index e6e9cfd..2722d33 100644 --- a/src/pages/Map.js +++ b/src/pages/Map.js @@ -1,14 +1,62 @@ import React, { Component } from 'react'; -import Typography from '@material-ui/core/Typography'; +import GoogleMapReact from 'google-map-react'; + +const styles = ({ + map: { + height: '92vh' + } +}); + +export default class Map extends Component { + + getLocation = () => { + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition((position) => { + this.setState({ + myLatLng: { + lat: position.coords.latitude, + lng: position.coords.longitude + } + } + ); + }) + } else { + // If browser doesn't support geolocation, center map on + // Grand Rapids, Michigan + this.setState({ + myLatLng: { + lat: 42.96, + lng: 85.66 + } + } + ); + } + } + + componentDidMount() { + this.getLocation(); + } + + state = { + myLatLng: { + lat: 42.96, + lng: 85.66 + } + } + + static defaultProps = { + zoom: 15 + } -class Map extends Component { render() { return ( - - Map - +
+ + +
); } -} - -export default Map; +} \ No newline at end of file From 477ba6660828f702880305435c14348e070734ab Mon Sep 17 00:00:00 2001 From: Al Duncanson Date: Thu, 27 Sep 2018 14:28:49 -0400 Subject: [PATCH 08/17] updated map component, wrapped with api key, added markers/info windows --- package-lock.json | 30 ++------------- package.json | 1 + public/index.html | 1 - src/pages/Map.js | 93 +++++++++++++++++++++++++++++++++++------------ 4 files changed, 75 insertions(+), 50 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39f42a1..78cf340 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,11 +19,6 @@ } } }, - "@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=" - }, "@material-ui/core": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.1.0.tgz", @@ -4669,22 +4664,10 @@ "pinkie-promise": "^2.0.0" } }, - "google-map-react": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/google-map-react/-/google-map-react-1.0.8.tgz", - "integrity": "sha512-M1UIXrxUhwMjNiUkw9DiVSO0fh7vZOxgGR02grzPOu4S47sYV25oeHcsK32rvGuNlBwpHHS+T9AV4aiRuKNXuw==", - "requires": { - "@mapbox/point-geometry": "^0.1.0", - "eventemitter3": "^1.1.0", - "scriptjs": "^2.5.7" - }, - "dependencies": { - "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" - } - } + "google-maps-react": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/google-maps-react/-/google-maps-react-2.0.2.tgz", + "integrity": "sha512-6cYauGwt22haDUrWxKQ6yoNOqjiuxHo8YYcmb+aBvNICokdXmZOUB6Ah4vD5VexMVlrwP2PFqA/D8sHpEB52KA==" }, "got": { "version": "6.7.1", @@ -9719,11 +9702,6 @@ "ajv": "^5.0.0" } }, - "scriptjs": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/scriptjs/-/scriptjs-2.5.8.tgz", - "integrity": "sha1-0MQ5VcLmutM7bk7fe1O4llqnyl8=" - }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", diff --git a/package.json b/package.json index c7c5f72..7993437 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "dependencies": { "@material-ui/core": "^3.1.0", + "google-maps-react": "^2.0.2", "react": "^16.5.1", "react-dom": "^16.5.1", "react-router": "^4.3.1", diff --git a/public/index.html b/public/index.html index 4b4d08c..52bcf5f 100644 --- a/public/index.html +++ b/public/index.html @@ -20,7 +20,6 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App diff --git a/src/pages/Map.js b/src/pages/Map.js index 2722d33..33fc6f8 100644 --- a/src/pages/Map.js +++ b/src/pages/Map.js @@ -1,13 +1,15 @@ import React, { Component } from 'react'; -import GoogleMapReact from 'google-map-react'; +import { Map, InfoWindow, Marker, GoogleApiWrapper } from 'google-maps-react'; +import Typography from '@material-ui/core/Typography'; -const styles = ({ - map: { - height: '92vh' - } -}); +const API_KEY = 'AIzaSyAZ_0J01bA6wCbIPK4UBq2RUBC-hIqG4mM'; -export default class Map extends Component { +const style = { + width: '100%', + height: '100%' +} + +export class MapContainer extends Component { getLocation = () => { if (navigator.geolocation) { @@ -25,8 +27,8 @@ export default class Map extends Component { // Grand Rapids, Michigan this.setState({ myLatLng: { - lat: 42.96, - lng: 85.66 + lat: 42.9634, + lng: 85.6681 } } ); @@ -37,26 +39,71 @@ export default class Map extends Component { this.getLocation(); } - state = { - myLatLng: { - lat: 42.96, - lng: 85.66 + onMarkerClick = (props, marker) => { + this.setState({ + selectedPlace: props, + activeMarker: marker, + showingInfoWindow: true + }); + } + + onMapClick = () => { + if (this.state.showingInfoWindow) { + this.setState({ + showingInfoWindow: false, + activeMarker: null + }); } } - static defaultProps = { - zoom: 15 + state = { + myLatLng: { + lat: 42.9634, + lng: 85.6681 + }, + showingInfoWindow: false, + activeMarker: {}, + selectedPlace: {} } render() { return ( -
- - -
+ + + + + + + + { this.state.selectedPlace.title } + + + { this.state.selectedPlace.name } + + + ); } -} \ No newline at end of file +} + +export default GoogleApiWrapper({ + apiKey: (API_KEY) +})(MapContainer) \ No newline at end of file From a19b738c26c6e8d67b59a9815abd6115c558a11a Mon Sep 17 00:00:00 2001 From: Al Duncanson Date: Thu, 27 Sep 2018 14:48:59 -0400 Subject: [PATCH 09/17] added comments --- src/pages/Map.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/pages/Map.js b/src/pages/Map.js index 33fc6f8..4dd4178 100644 --- a/src/pages/Map.js +++ b/src/pages/Map.js @@ -2,8 +2,10 @@ import React, { Component } from 'react'; import { Map, InfoWindow, Marker, GoogleApiWrapper } from 'google-maps-react'; import Typography from '@material-ui/core/Typography'; +// Google Maps API Key const API_KEY = 'AIzaSyAZ_0J01bA6wCbIPK4UBq2RUBC-hIqG4mM'; +// Map container styles const style = { width: '100%', height: '100%' @@ -11,6 +13,7 @@ const style = { export class MapContainer extends Component { + // Get the user's location using Google's geolocation getLocation = () => { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition((position) => { @@ -23,8 +26,8 @@ export class MapContainer extends Component { ); }) } else { - // If browser doesn't support geolocation, center map on - // Grand Rapids, Michigan + // If browser doesn't support geolocation or if user does not allow it, + // center map on Grand Rapids, Michigan this.setState({ myLatLng: { lat: 42.9634, @@ -35,10 +38,13 @@ export class MapContainer extends Component { } } + // When the component has mounted to the DOM, get the user's location componentDidMount() { this.getLocation(); } + // When the user clicks on a marker, pass the props related to that marker + // and show the related info window onMarkerClick = (props, marker) => { this.setState({ selectedPlace: props, @@ -47,6 +53,8 @@ export class MapContainer extends Component { }); } + // When the user clicks on the map, if a info window is visible then close it + // and 'unactive' that marker onMapClick = () => { if (this.state.showingInfoWindow) { this.setState({ @@ -56,6 +64,8 @@ export class MapContainer extends Component { } } + // Set the state of the component to contain user coordinates and initial + // marker and info window information state = { myLatLng: { lat: 42.9634, @@ -68,6 +78,7 @@ export class MapContainer extends Component { render() { return ( + // Render the Google Map, Marker, and InfoWindow components Date: Thu, 27 Sep 2018 18:00:35 -0400 Subject: [PATCH 10/17] added images, added styles, record lat/lng onClick() --- src/App.css | 4 +++ src/images/marten-icon.png | Bin 0 -> 15324 bytes src/images/tire-icon.png | Bin 0 -> 74006 bytes src/pages/Map.js | 64 +++++++++++++++++++++++++------------ 4 files changed, 47 insertions(+), 21 deletions(-) create mode 100644 src/images/marten-icon.png create mode 100644 src/images/tire-icon.png diff --git a/src/App.css b/src/App.css index 4e41b69..09e6b2b 100644 --- a/src/App.css +++ b/src/App.css @@ -1,3 +1,7 @@ body { margin: 0; +} + +header + div > div { + height: 92% !important; } \ No newline at end of file diff --git a/src/images/marten-icon.png b/src/images/marten-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..20e396d8324b36f1ea1d8cfbb1d9735a4ace0c86 GIT binary patch literal 15324 zcmc)xXH-+q_Xi4}fOHg;&;$VyDbfT)P^tw1=_Cy;~3@6cv?DXab55QF=)b z2}Qa{FM)ux&_YQ9gycDV|Igd|>i*WcS?jFKnVG$3X3su*_U!r0Yg1$0ldNZ10RT9u zuXp<%0MLO+I)IrG{M!xrdjS5OczRR+0WYpT_~gj{Yt{aB#4kySK+vXGdQbIUj%5tPSx9$ zgUY--tC3g8;bBZo1MW-XGt<IB(*Gc#4YC1FfY1LR5d*RTz_9}Viv%PF4s!Y*Netix8U2qW_8*`B zXNieWsDWX>b#Iq1Lz{6CexhK*F(EuuIObPtddnsz%K%LBjm8 z&~Dd~g(ZlF-^s$OQG{#9ogHKcJkCLBe#nIL|Gi$KM#?47@+-JX&VZ%N(FA$!Xrd%g zx|xvjUxp6>tw-tlh11%o#n~NG%t=!b)it~PnxQu$K7jAqAqg~n+@U59&Cdk>g9Xfa zc>$1N&m*UV--}2;uHXcx@nWPQjKE%ch{|zC+cXZMugroh&l4<;S^i{-!LVGS&gXK% z10eqm?qLEg?Q3%69X*O(&uN4hSZ6kJPU{x*HR5F{S$IROz#;o4nAu|e6CsN7JZgwC zZCccMD<|2fBzM<@q{d8XKbYD)57zKqE1+rO-DW)6XrcD$@_n6`y@j&8?0yvY>-F}r z;$FAFM=IMkFM>6<+6!pcJj}2cgh<=bsYyGNN#Q|Bnch}dAH)70=GEbr9|Z>4+F(Vo zr-NGNf30j+>7-hd0zXAdQRjn@%L>JxiW%zfXxGX`Wq_6RYFd$zhaGKCZ^-pEs$Q6` z3mj_6qKlchjGRtCyLR(u+HD0;5}c%h=aLSI&bc37eb?uv`PuRWiQ}GX9*^X9DJx$$aFnBbdB9pXghPJhP+>aCph@-}&t_{? z9POsxi;#N?9eQB-DFxI*(ATJZ& z?RnI=^r?f2o_8K;#bG)Vv@)REm@(MB=e;?P{7jM$nB%3<`-bA%>K&JC1kT!0aASCs+053^HcL1ITzZEnHU21O@By0v_E_>@m8397`zUn zs#tGivNT^p-2v&y=DQ})A&fWSW&s--PaTwyZi(!g{w0ntyHpQRk$k5Nl3Qi>_ zQ0pW27QcjQC9KGvk$e^Yq}MzApiWCxqT3T%<*aYH%u378Ts3HJXrBfRY<%>fmOV7S ztZnnxRG1|j;oURw`99~b%cMU)a|-k24&o+iT{@fY2-)FBcUL&Te&K54H`OckC~?Z; zaScl-?|-%$6K8+xZaNlv#Re)A>6S1?Jp;u$D0korm(yUI$sD^CJ&-K7HpG3DCWkNn zHhE>jc4;^=UlAez zHrr~wWpbML^}msqM@yyW$|eWx9M>EMZ$U_%z0N<9;7W>34Y~~)TVmk!h@obMB{by^ z+8_j{_pDS^dl$54>G)c!?jSKYH(+`0sA0}ZgO2P^7o(*^^U?WKZ9^M1lOZq8990Dr zHh%h3=l{PN=ay z_1%?uS<~(>zq!N*_Oyu>i##NZzK+94o5>wa+^el=7*lWms7rbMsf5kKoI5l$I_>na zsjk$T35&yCs;D{Tq)=c?LRcE)TPy!*y+nO8C?Vgl*!t^G!w}RTXI@IJZQ1TpLSyTU zU%&StvQ+X4XgdVLRXFZ>-ZJbr?Ck6%Zc~H7)oC_~fp%d;lcL~ZJLBOeMPBr)Q@Ym^ zxoE(YrLGY#VOCYW)xN*po;?#bv>1Et?GuP+#~$95KkZRijfQD$mIcT{%%f841|^kx z_RQ#OiTMX>9rkZNKECqzV`d6z-gLJ^cG)N07u{4NEMz+%)XnL;pOEo*lOd(OeFw({ zYEzf#7FOzUd@RnvgYF7WQbT2O*{e*kMt(z)_Z{Xlv(OvZk?cvAjwVKdMU2u3PwT%c z!x@m(8}_5ECmr8*gOrKhW zh-llh`6}p6@TWXba0lYI3n~4tZ7TI6Y@48?PFfoUy8(susGg~c+F%0;FTtI@;QgAR z?WiPLQa;E;J3>{}O@NCfrWAVEpYX&Zf98dmSBb}=CCYr@K^ zaO5WcD83+vUxUwqLGP7Q^z!qX3@`J?5W`onecek`@0m~! z=fX0Jy>{YmOGDb^WWALs_IPWAErKa3<5nbbVZpV$u3EdrWLjLjpo=7bA zcOG_w`_12BrM_Krm~pPakq!<#mj$!nQ~j8H?%k1_ zT5>w9$s5)%g(=UeZzu##ljQ*A5Uffbr?YNkZ2#<>N4(S7^K|MG+1Ahr5Vu{^lDUV8 z2^8roG}D6gOCMC!e@6Yay874CuGX7}VY+zoD#zK+Y(ebRIKF;gVP6w}1aG(B4FN%L;CM zRwnwuH(25)2m}8D)B9gCiIH9h!=M<8tSQ?zT3h|o+@0qL$G;;`0XA2a%#<(lVOxfx zZs(2vMh;g)4*uS$9o8woFnfj6C|0a+nvUR;bVw4l-+e-oC!8dpp~MTD!lN}mCho&5 zSMcth&?mH-L!*;FHAY7{3YG9ZAAdQb941cOJ-ijNrJ^O5?ELOT0c;_KOBlLjo3d^R zZ^ofRbfY~R;=fc^P92-I+=d{L*VorCzT0?}zWe~)_2sLyvRqH+Rz&{8LP~J0>;}7i zht9N+^*xK(VeIuz_ZaP6<7%}I8$Y!6+G(u*;(B0^y(mLral;tjTUhu3Udg&~Ep{$# z?GXnlLoYBggFt=(`e;7Z?uPxpcU`_F3YRn~KI@Re2mUEBWx#|wP`!`|9GpPR7WaNC zMl0TPP(H{8z7=%~Qmc!7%agV!5V>yNZj*6)JegO>Tgcg!_aA@CG#V4Ks+N{Xoo@*% z{MIx;+Tp7TO|8M6TdhzY>Ge_qy&qRbdSou&%14xj$6=xo+x5iQqol{KdWfJqcGoqr zmsjXshd!d6_IvBbjc+@LVYovE*^{Sw24uXso=tze7wIF z5&0gme^3~qK`_FOZp@oSiLGI;Kf0>#ABIKFTw5~2L{Fur*gZ)sUr{OU)BC69|7bt1 z&&2RgOfZHD^{cd!+Tb=(nyU-Wr>qWPOd{8Z7Yi+g{^_QnlKrlq;_30yaw2H`rQ$!H zRr3E%-e?*(itD#FoQi2Ipef)Ls56h$F?}8@ihlTTi)jJPtLSMN;+65&CS|aaj>D0w z9|g3cLzar@Vh;K=1d_fqD5CC1?{WEwLjYgc?%vUnAc2ny{)-{(v-=%KzuZvKTyJz^ zfOW0k;mCPbm&C@SYxaAHT!b@aD=SOFp3-rI(+cL#8YO1o8Q)P3i#_0)s)KgzFHad# z38V$X0fFmlv{C%v}Sg<$Gg)h-Hj2 zP;N%->g}9ORrB3#rClo%rYb>qoK?)aWP6meR%MobE`#>_?ikhmWn40(q=d3ADBy2L zjwWsyJA3ZQ%s<~Pilob%*3^os+E3CKO0U~OxO(*#)(OvD7Su2|;$191>#l&^{BwhY z%iYVDC>Q0MH||HEwaZFJZl2`y50fEXrH-DOUKR&xuEVh1umUcU?&m}cuC!Ks_4w38sy!4C~ zXtR(hZh>X?mIkqvZb5~WUVdqQJAAQ1a@Qx<`4qlyKNU>s5D4n8wWkP=p+_W$nK#Nh^x6312mRkiVQ#fsxk8%hT4g^6`O1C1d^0B_A|9nx zhE99VQ>v;S$x>3RwH_LOQ=^%kc+&$v+(^b3UDi_qM3KN#BEMisumBO-&(KY^k;8}Esqym+rEokNOM?_+Cp z0bjzzV0~Dpo`cy2UI$gyuAccIYjJB#$kF>CH6zU{+ExE?F=76&M)1d$)`3q}Voh?U z2s-ZYYk3P(n+ZLYu*Fo??N&m5Ke{7|fpnQt`YU-lU)FTusi7L-c3JkB4qLXk{SvZoEsrAyd+rOlud zOyY+qxdKw0@lWTphOehD4S&miXlZW!XgAnGpgS%rDF+(b_9pcsdf$cN@qBI}H?1tV zN5NK)Y1dohBLAWuD+A7kQu4ZkYaAa%shj9!QyaS%SCnT`ksSf^ZVnqXv)q@5O`U5a zSuDZdb#3HJ9PiR8o1Bwp29YpJ4gB2IES>SzXoE`srxaFI&7H7qXeL=|Xz@>Z5}8!i}$p4TVS10mouVka!_UnJ`Oo!9HI!($dG}4mJ1~!9cv~1ZKn*Ab9GO*w$hp; zooB=V5g`ms3FjK6xgnfk?K)NM{8Im1`q~IuInq&vY7*bC=yL|(Ou->8MQx70G`nZ< zaLszMlV=j*$Ah`)?Avdb&>qewXyL}!zHXL?oHu0( zO621$E|F*;W2I&=*`SCb5@>gk60BZkUp5ae99EdS3-PdHjh&HqOMRZ3WqQe^XXJm{;hH44tN>>8s z$Ao~L-MjtP^1a7Y-T8@>4kS#gd(G@&ZE8LWk+h9J_0rbHxYdFNyHxyt<3v%jnsO!2 z;_oJ@)#%VlXTTM>f=9g~tNXcbhyhIbVkz0@A5;re4|7Uw*mOs4YM`@D%fGMtYx36k4%5gIBAhwb;6pWq6h;g4~e7c6S6H+Z+jW} zt(k1$y+~2r=8pO(zwR+W=VVRQ)%OhM6w=V>|8;h#&7>()EWmH_nV2fdGP>N-k~>_p ztN4*?rU{>od&ii^V%6CpB_;J7&*Nwq@oSEb z-!FyfD!(9349ybvt0x1TJ!wFOu$@DDCKef2-h2`aNnMuf+LB{lep{hZX~fy_&4RA9 zA46mCJGFBW0uU}yV;zjnaC67XJmfm8J(+P>DZjm}{c(*V=13>$_AZ`J1$FPs2_TQ=p2 z+`Y@zqdNnARoLjYlV=9A#T|sbO)BhIm0SwB;?z!}?F zlN#c3N&MAHn<*KTJT<+vP>T(|lXzq+MGayP9Bn{t94u#e@Ne{`G)Rk;_A3vV&v%dx zT?nCzFgoD5)b{3S7`Kbl1L5Y^J_!=dYduTckwv|$0j?J8wR}r`dVvw^foK(^UF$UQ znzX#cxBg-^p9petzmtPF(1Lc-`n6gg{lk1AsWcso0*;}I;H|T*;Fq{~UfX!{S&+!W z^;e`Grbr{-aBY*0T{rg>^!&kuFY8lf2(SS^;>S7J>r12LqIf z`{K&Wb%()Uf$W55CYFo?U1p;nLnud4A0KO-092)kn^4~PD8J?q(N#=T0S}rH66UAwfz7A?VXwH`WTv7eVp6%W6@O9ZiVHIGkFdQ#+Q{ zd9>#^H1ojNkGZtjGs-M?{jiXY#hPt)rkLSe1zH+3z|W@HP9}K=y%WS;UyP>H{!aZp zx_Dg;L%X+zl~Izr)`RTnGY4@Kb8T7wgnz(lVo(1P;9MYaq-q0ZU@SJ?11t)-euv-$pV!@T0 z_O99&mi^XofHu6Hpj@mtSCsRRmx#&z0^S1FR+$Wc$` zNXLgXQ!eN}H*qbL&eZ0inux>~vhbMZTF}n|;^k{`6E}c(|G{W@O*xd*RwodC0dG1{eAk8RvSC5@Z!rUA zvJ?bwR-2NaXQZD{VoUz6i3*l$ z)hWjyEih|yys%XLkQA6I~KrEo>Bt8LFksu zd0(;#t6pA>TDvTm;Snrt9p-%%Bl7b5w!i0e2Q~Rgg)KXM3`!{Anu%Azw=+Pi9a-zr z)tAj2G%)1fo4elZWxjafn*CSqc6}qZhVs@y{W<2s;)8pWlS6gh1U8_dd=%5P_eB-n zdKX}Jo}9MSAK{ z%4BLrfYH0|`!q($q7yM9Y&2_J^2@bh#9ODo7Q9*T{Q!=L?{U?6DapLR? z|Lk#PZK}K5a*Oq$Vuh_rx6EP#-&o&X&XDcqp{s!Hz{X?a2&0HMH$k=eLiXsVYKh^- z?Cb|RAd)`C(ueDI-Li1E6VN*iCwqu;F?(xts(+r}jnq(V{L$X|yWdZJ)9wCcw3dgL zQDs&=!8kz@A`;(96Y_gH5DT+xuMqN5KGo)i&m9FLeK+?VxQJ5=v)Xx)wy)}f;!c#F z+?hxMBh-_~d&#$>1IYUsK56}5dpqqS+C@P|Et@!mc+|NEgQJi6a(cPjKa_=KjEU#} zUJUQe@DgMYOq0#&nqe_DF|$(~cofBC$Mc7!cYD9(lk!uW=?Ii-n-tWHE(Re@sbwIh z!|pZ8t;xXsl;g{h>~-FA&cV{@C?SJac>g7$qw`Mdslu{P ztwd4H+6J3Tkw=YoHPjK#cfzcAVpk9sT2K%Q&j8JEGq^Si-;*blD>hC*{BI=V-JcFxY#? z9pR?^IEum|-hFUC-eO0uT%HRziB=wuJZd%jK9?_HKCuozjX~dU3|e*4mHisjuc7x6 z3^l_le$`;?y){RFL5=BREHPR`{q33)MUO#8TxmH{le4pnM>4YG_a0lvJk7wf=6U&N zx#S1Dn$y$wEgT*;4mlQ>Tkb#22@KDN_bbP>>H}K^%{W!jpiZKbBo$PJgjT$%WkABB;Wgqa4UZ&JgR3R8%U@}Y0rrPb+T0Z zkw&q8^p#k}I^-v8gvf4_zsjV1sA4MFDFci`9L}utrI;!&j1Tz82zy@@UT+MkJ$L*ebvUvkWJbZ4x(<_dmdj6 zu7#T37s+QQWrW;Vspdm{qiS0#SDPhK-N8HWd+;8gjr#2(imxPyLt6Cb5C!EIj#P6k zv3uvn`U)3BY7@sbAX}v-5S}fl$m#5Cx)M@kwDvir>KkbrQ|@2n_tt!KPWV$A?jwRi zLhS?DDt`5EKM!HkNd+DrqY#3^QPuKlL+bviUFxb0nG<*zY<&M(Qw_@)?pgc5Uh(Lj z2zWG|>1yz3sRLI@H33l#ZzZ1|U#t1tTw&!@wz;(hy%*0SfLg0y_BZF$w+U~ zwvcl!G(zL_pYBmTmZB7l57!>G2Kj6S;*-00IA z@157PEyTA0uWYQ4RmT2XAX9MUIUCt(+Dvg~3%;7g?(*rcGkR z68B=m22x>=&}(BFB)fh!+~<9FNCpq`IZeXPG$7%JdL}PPZC_@hW)xnTH+|aPE@c>M zK-cn!aX+rjr};p1we8H`nhS|%%kJ2mnb9vV`}8h+?j5mh>r&fF8U2yZ#-!pSMpk>> zymds$r#5eSsuJ#rnV9j;T-@72uYm^pA-F<5a?H*y%PHX^WY&tFa+?ri3F|zVI71{c z4c`r%_k8MTVI}T-iq(G+FL2P?apaKeij?@{UReH_aETbFIWfBUXsC@vQ$9X7r_(#8 z;nXio;DOrzF^j0Sg!LpZvRWK41*G@?`B^+r-Z>)c=-?flpmefp!tk>>D=k#2Yw&!3 zYzZc?Kzvzgy7I;s1 z?FMx7H4BLs*op_n-FX^mZC5k2uVW$*sn^2=(_gq7h-{iTnsbq;D*XeCX^1yaBfH-cPoSC|-Lrdq zgwwnr!&OdX@jXzH^$Vpw_wESr)8I9eWC3)~{*{2oHIs3xZN-Nlr2bF`o!`OlZXe~w z(2SaN6GI8uA$pH@E^MVdVO~vD?lS9kUB^D`}KPO=9QHqP_1#w1N)<6v>I zgDIwIq0cuSDOT7Fdr(*ZyhyD|ojeHjYF{0+a2_}PF`f`yRMHnQ@rl8qR0^6Rsv!J-`$*$K{!XGl0$jX1pq55Cp~>?7qXQpO?=|H~V+`+J9##r(28_f}%F z_WyLHT#P(g!ZFWYJ7zlfg1p%V_eSsH7i-MEX%v@~|Kt6~P`&lU_xt3RuiOJ#d)rEe zId7f7Q&c_`uU#qyINH4TK639%b%<4X+@pk{RF~Ed=sl^DQLk@h?Sri_UXp%eL-Bo3 zQ{qm|HclG@pj!j=Ou?Fa46>HmP8Q;X&n0G=Bw$02LaQ#86Aeh)P0aT1b>9--3$YXP ztiBR+@M!{t76+?zA`S|(6ry7}n(pTLURD{KP?B-&_YBDsk zS^IRY&aG*UgTArVvS`*+yxAc{UFh$9VA_9mE;8y3=bI)--sC#)hxiHV6CA+Mq`4hb z`K_ZO$3g4+2bx1UudQCnZA3y{eLJ{pLH7!W=24r_TVNzg->{e}%)YQ76|*6x#SSf8T;Em(LX{^k{N^g<|Wp6=JfD-}dvVP`>L zff0RQeJLPj`KGeQbmDW(&<2Bo&!{V%JAYL0k*9t>3VCN4XRrbS7HtbAoeuief3+)n z9Q2g%)yL*GC4{`}k_$!9xxMl7k|B9e$>AF=5%k(|S&#yz&!&HGjkj7xT5<%i&K0FE zi3enw(7w`GL6NwetW+8;Az>Pt;hm)FvjeuRw23hdj{!O(-OQ!L2 zzEep82T8y0ngsDC`3ukU0zr-XpBfI{i$*^xyF>3WR~A(fS8@B1BIQdKIxw6)`Y2^c z;)xuL;epZ$I77bRUal?&miy4rJ&`VEswcRf|BW%1`}egKl4PI>@o%*`&g*n0`_eT{ zSJ8GfwL|%DgN?|+reT;mL%N>5(d)_j$7e|jnvlF-y^S<5Fe^pmlG(N$z&^}IWb!;9 zjDE~Pq|Dw9`8*G!!5f{ll56Bv1JvaD9^(u)He$F?$?s|Fi87Y*d>Z9V=3)`hIi^eP$PWr~NP<>EsaB%Wsc2SwhSh zeuxIrsh9A>R=&fDZtcEv~ZC@Zi4a)b~_`_h|OnRQ;`(X*A51C_Xgy2NNTg zA|v;Bn{Ay8`_Nee9Ay5%plJZ<@&RNvYnKx2js1AO@JGF9r^eBbw$}=ofXZ0&sR>yV zlPp7VIg&5-*8(rL1n_P**U`zJytZKXtmNUbI9UY*CAn7obV3!H z8prac1kkLH3FoT>9_F+Y!zEPgNHzEb(xXe%u;2MLIVYFd0)rKE8ZJiTMHsHX83jr% zvus0Km}IAZEi(WevQ~S9;P23==}Sr_wKJX}&=%g6=u|&UO(6T;rqmyl^G}O9G?Vm& z>lGHhv;tnBA$!JGqgI_ifd(ECCaU}NxgreNuz_7uR<|ThvsP{1%Q$iC=$xujfeEBy ziK-(H*sU)-#z!qoI?Wt_+Y9;3X}-Tm>gH>Ch5b)W_LO+h^)f^88@Y7kS&I$(UAmTe zWA7kG{idvMQ{UZNO24o!Y~}J|0BJYu-w)f?tkpiUg)7XR_W`Z<{+psu;Oh}B*_+r? z^JR>Oc8t$3P^7>1og{$cV((;;XbJH6c~)oAHj59Y&an0KhadJcv;(+2y>b!;;`+LU zsMF;iZbVwIUNbmM=XzK_y!WPcJ?AN(?OT3Y3A{v9v7*Mm9~|+WoS7{R4_C~_0t&?2 zil8K6yqm6^#$jhDMb(7y zee{4yYQ)tS{exm52|}*jLx5$Y!C8KTx94cw7Pr1#PA(5`bDt`4V~i2LUcd5>JGRpO zAO7cgzEt<7?;qq}OK{DpRlRu~C$*YNq*?6=!z*drgmTU#>67znRc{4J5)F`+LHRG> z0`gX#>I{OJ;Yty(Wm0OL;HW?=3t_$iVP9pvejmxD@~i0CkJ}M3m1i3LXcq@1YOI)E zFkGvs_(5Hl|KTBpgJ^rtHl|iX2BuJ9Xf_(6O|-@q0<`i0)GqgDla)o%nVW~f$(fV9 zk#bZl55naQSa=rL&gQAdkLvm`wLCj_;f}NYXY6KMRrxlQkq;2*fjlfOt0L0$~>bmp?rR9?P z_<@P9k|4qpi9@{V&xa78O%_n!EV?Xr&Xd)ifCf*M{9e~eQ-fb~@k;_Rs*EwCIDbx45LumuiGB~E z1LB_oK<^{4C2Y)EjPl_y0O|s)Qzmh=@9Dq6L5tl7RF{j~ zMl5*a#DV4H6KRmVgrCQNb-?#WY5|DG;>-jFrths3ljU7S0N|YhU^iFfy9ix)DGvO7 zz^f)pMe~#>f;UdO_<#{rsob{Pa{v=K(iKKJK!l%OJ9VgINhPKClnzje3>-d; zMyIzv1e>-6R7c$jf*_VM0k~XNII%9;63EU7Xn$vjA*sq{zc_#GOvq8wRryRH>GeDx z6o@He1`cSd8mGT~|1JrI9Qz;bp;Dh6UIO-

*K*-^f5_H6<8!KnUdgLp>h4KF_l4 zRZfv0XXU@1G~Vb;*|(CG&2d}g3F@g(2Sy`d&nNN{}ZWo-cP;{fc9;r~_#M+Q8Z zb{{It=5KKOID;@U(|b7xcEr~tp3(9rzR^LdCH^gz5h@a<+x z^mW-}wnKqiBh{ z31z|sb|J9abS+EM&<^tpviWSl-52_{g(V(zyZT*H>>_}+3|$O2osho`pOXKteW>=i zscTPmt1QC!>Ev7h2!MkEPo|*lAI?XzUiJ=hO-egIOUHN`5Rrq-J|K7sBIpvcz>u#? zbc__c7@)mC5AqsmluGP=m3iwN@E6?WIK;--FrN93z*9ws(7L-ju*ZE@He3z!c$mb^M zAV4Mav7|eU9GfIHrt4gWw3k6?;tzZKR~1h@P{;!(m<50ZglV?afe^}pO;%IzoUraB zz;Rskf3y?pWic}~Uj~?fe?RLXu!pALXwLwBXXG1CLb@+}Q{Gw~Zf<`N9KFQI$PI|_ zKw4NK9#f1lJNND-*>^YG5~j1u<==v_U;0nJ{5TcwTP+y=mG*zqk6&E}rt17^6pUIE z;OHG0MxOsa`HDk8U!#a@FL+cd{r7xcWuLiE%$?)XtH;cOwt( zoDLzL%fUM;O<6y|X1$ITRsxLooPva1$7WtDXJG@>(t;ZIDS{{2f%xF#;xx>TLtG4D z=tQvWNmT6Cb1GvAVxRkXG*ZX<_@}Kb>Lp-qm+2!k9)6iJ4Imsrd-_fs)D#ihrddm7 zQxF%hSoW+jIGJogL4v@{An5=yfAsGbIza5d55|&W#pPSKJLT!@0Bg4X+AKp22Jvv) z@a?IH8V`Oe(7GIds^q$msZGwya^P~Z>|K5Zc6zGPYs`;;MF(~+yH)rehJN8YuF4Kp z4M_=+EakjxoU&aGo?YE>9m&vOsF7K{avaE*YH)8+t=maL@9r&Q!3Bs9+>-MbHV3xv z_OQ!q{$l!%$w`ojs`=EJ0A|$*$ZZf7eCMu3u|nW0d0IP({{h$v2UsE9Dd*gllhyN> z6h<%)plcC$(Nfa(LP3s-hWfaGD#{G_oPu<~qX_rd>9sG=vjWZ)KgD6DC^V1v5y$CC(gS zwno@_cs^xqXq1l~ykY@qnH1SlsO;MO6)QN=`%&vS2P={%8@mL@#^!C&5S`Am$2aqS zGCaHgHIS~Xt&k;bffmJh5{LobjA?J(Fq5v}GC6#(8|}=HY;tTFPsD7+Le{0WxD_m? zB!xJ&o(?$Aa*TXzTNky>?i7K5w-^g}*^{|kL0YVlD0-oKPHE+?_&kio=`d z_kX|4+1>2U&hE82_uR8{qTgt~!Ua)*00024%4BOhk&H15a;x}BVc z8~{+82!5~xBI^v+uXQv406$g$02U4a+##D_`v8C!9{}*j0ss)t0079{vfH#Jkw2hX zsl8GJ0KUgFLy$F0PZbR%%uRGcpeQ-TU0^?QAV5V??yb+_uRw1Yi&Ep0!S59j&3Vd? zWQs}zm)IkpN2Lc&nPaSE?a~`yF+?~w0qnL)+KQ{h%rT#Md@%!KUJDZh?7|RKZvvEi z$B(x?UA+w+pZ1qc&yFEK9w&~+HCK)=ay+`;nR<1Jqf42^qT8PzO$6_{%cigeFRs?k zxl0W8?kL*ca%Hp0X4wTV#-S}Pe_ZB5fd%D0I7la;QLGD~128I%Uw5Mr0QxtL_OQCA zCibuZmqyF{t)Cu~_7~-SCDZD1xLmU1nFCk^=$ljd7DrmJiKe$t@TiXuRQ&6c!cGZe z*=Q#itp!}v-ZO6es35q~g-UXQ=~eQ6Su#r@$JxcQ1%}r_X+C1pKe}&4WYpH4TC&|{ zRYr6&_08Zk)$+A(Zb+YTEo@cydlz8_Sy_mjqofnVPNleq9*3jZ^U02EuPTBIM^OM& z(o?9$>nOcU;03d^$)_G5N_QUA!LoYmY2OV55S*U@WyZU-0I02{tI`LTO%nNd%=@y?@zD3;d@V5cS&O5P^EhT2o|UuR4* zA8ef&8|g8Zw+PvS-aIpa|9l#B2NXQN1w(_5Mfo9Ik_gnyJROmLjMgE~IM(1``DJuU zx;w4rn$tZxFF(rb`d`EAKpWY|DC?o3%O!pO-@=e>KOO@QDw9%lE$ z9_9JU3eOdw7oh1pxT2IJE-Nd)3p-tJHLZ8|CMwlrUq>$hyODj&b%k0(5-^rG&?S#( zoc71t-~R%#qfr2Rk1ue!JNmpF#h{^KxZDqPUWehZnWR>LwcMVPGFec13lOS4gyKE> zDeKj4L?l9SO9$M}%cmSU3+Porn7}Y6M3e{1!@g}9+Q+F&+a7T@ykc#dq{{ppF^Etn zRAr}G-EI|v8T};qJh>mgmnMD&_(Q*Vi--G_L3ZA^7Ug+)Tg(f_=S_(9HT!Eqd$PC& zft&Xk!N+&Zkbel4F!yj_Ig~}QW%zGvFF+hOU2!8H<*QKUG?yYvV)SfoI-B+JEGq3J ziCEeBZIbm!M3SF_$*C1Fn8P^~CJ`G|`;Kb4v2l_t^H;BpGOO!G9kaDvffPh=a@5$ovMNBQtc3GoiEL$qjuoHBPp5?%9utI}% zVV=HVI^bWr^woW;s75iA`Axq8lI?S2r~QDqiObpy7jJ3D%FbwiGTa5{mw6mN{ zKz)QpM3|S0X~4o=Y-ldDbPR87h8)5Ojz{U!rGKXqLb$U1<9p>x6W_pia+8oPLbJc( z(S#d5VJ00%b3hElEUD2Yvt?L*C4h5ow>Gul;#Zwil#A%y$l8n+yl~hNFvmE9iF!P` zGuY^ZyIw#>iJ1=uLX81FqNTMp7)dT<$w(#ipInv=-Zub~CNoDEXNG8D++|70?>-&- z0U=qR_I#Hk$d8EDs%vm>3^v=P&!Txv7hAtYh-3cEHf|YC&#u8IvA8Hzp}V^fn#Op& zPPPt@Ll0aAwsFw2}akF6EEUpGF(*i2As19tzr<=EzGoj zFxk6`(0VHDyOZr%I65Hm4(d|+13E6ae1nR<>H z;s+i;xQ*LRB*nG2Xck^pGxX6SyYk5GdT8roaY4OMJy#i`GxOd|{OH*-t9kWxtymnk zmQpoWj3RD2RXA6=^liLH!nI2FnKBC34YlUB8ANwS?6rvTdVe(ADD#2sTDF#bTznRl1zH;+LODe&B5vt_@h0Rf9;1^%#z-Yt~Y z(KXyhbS?SAxQjWW0~+d90CIdh3~UH9Uxtw_oH1s`U$w!+CU_#w}Xvb%6*Xa;l5sjl-Zz-O-#75X$%{1_f8CgA!#?jD*Y0-y^Q zcs8m%mEXi6AZPG!Etec)V}?=?8{e!2e#1*Du78OLc&V%`c?{QCgO^_l=4o2*I{%-R ze2ekXEKV}BU#woBS>IR~4P4>S3tvbdtiLy?2MP&N5%#T1eIGa+2vgbT$$yu1bp0|KH*<`C>%5@)HF7)b6f$x0K)^j{;V`ZMP z3c~t<`$r4%7>_iEr{!Ey`<D8G1+T$1Ldsg5Ztct>%x0GC!hZ_oU<%P}UWA-t};F+ev5m z?_Y}`0J5ld=Te``ccN58`&WL7rdI%f%(^G(E-?XaFcCo4Wl!dj-3hZN7LTm$Dz7Qw zqeU1#0Be4`wFBaE@F+0t&SQ=O8Z1R>E4ju`!hpdvyR@t}TElUBNSUn#t1Jq{AVgs9 zWEC!xkI;%hI1b_yx5*uhj8fRkB`CY~1dQmIC^iO9{CySn!I)v_2Tiq}Le5;;let57 z4ap7JqO+HM)Xf3vpzmV`A(M%?!Ph6iDP1~l2q0j$=u81FpcyQF%Q&z(?T;PH!9eMq zpcWR))0(6?Sxi#8r@s$wTyu}t8r6*dqOBt4PHthP7CKBPqULD)Cw!Q>?F zbKj!88WaMqOe#0FkHo?69R~aK$fH3;QS4IaWAhHPDJWlATPi*~?OLCCbQZ~B0^D9% zZ?s#j<dRkkz^*aC;J+N;i6hd+A)3w7(J8`WqP*;e42S^@fI8g z$Oee}=AveL6ASlC!6pKn_-m7JLWq=EWeOWkJJIZ0vbj2W$7j{Djq}w0RCM`x+PKOU z0&l+0ICz)i2mc!-5N(!mf`qHlYa`uaSMLQr_U@8rf5MwYR$BD+nP{-!lA0@<6NQ=h zc#%TBh36)!vr2z3-Z^VG`LjQjXso!xDM0-3OlhU1KFf&!Mz3ksKVInh$p>K6;b!b= zDT)Ik(=^*gd**-r6~JG|N3%=UT`E(H)zPSefwC#FyG16$kDHy!o^Uw?b59P@iX`M2s>hZxxv9+n^z_FNHniK zaZW~hk=ZEI`EF_BIVjQ_vv*QH9bInO7L3L(G4ATNuJ0Sdj@6qf1<{a8ohgw4bPR0u zWdj1J7{UOkkTZ_351&MIrE$pDXRr`_SfZIXU$ot~vM{F5YY=wBd?qmUVAVrafR9HC zJ}TDD3(8Qi#o3Ip0cv-alr#?NINNLRST5HQHYL|N&=H9@0n#dw>nIs_4TKQa_f|ka zo>o#&1AxnrL80dc-9gE_sb&)GhD25$V39_~a|(puyqBuNgx-J{>XRs#`>derpGg6= zvXQS4=*bbkCVQW0@-@;W)K=vKYcSI1cGnn82zAR)WDY$sC4R9GA?1)Mp!@(2L{P<(~MvH(O@Q(Pf#;^7>BD1 zx@=qwBC_cQ)WgfPn#`O&jUE(N@HL;xVB|!OnEvvKZ?AVvapDj^$8U*-Bd)Wg&r~Lb zw1U@5kMcF=q2VDB^XI?$cH@5;eq46pc!|cF`x% z+z^=~$@)Pl7@&U76AD+-qn~oV>whKta7Qg=XhO^DhDwyw{a3JJP^^nO35MQa?FCP< zZze+)zrAaw-fLDM`kZvrm{K-|a50x0|0^oIB_2PCB$>#UK$|8(JoAdQ8rbnHrRgu% z<>6AK`ufMpqytvOWL3^dXZ|V}a#&736t`yP8m%tKQ&!#VH(finLVt0Dt|=QfE0>c;T{j!;EIo>iFS_wX;-@=oJpjz2CsVX8Zx>rt~$bphRRKjUfwx2KOIyx8A4*)ol6H@W<; zozun{3wVy}X>qcbIMOGJaMh+W9xQ5!=UQoW*T@KAYq;fO&b~+z>uAm6hYa}#giFL- z;9dC1Vf-V*yZ9)XuxOky5O>?M1vauw7Mu^I!9xQe{3iyZd@oNgX zYDB{a1c4ejFs=`jIVx|+=utRi5K5F(t~DmT6r$Ftuzwv+!oUdAYUs0-?H%_O=+>Io zZMPKoR?%2ebYJz398-)Q9{KpS(rlAk)8cgUaPx9+YwiZV`-9v!OhS1}$G}Vg|H03_ zaYV}Jj_>slw}}AC!=gFuIV%lCcuyNU`UkSm-tL^kO@j5UIX+JC76ChhwY4Q3B{evm zn$mHt`s#H|T>QzL4wIto)h4Sy6wCNWy70n{w34z6k81%gWXRVLTNPHWMixTv`LyD0 z@`p|i&YcfnLhYDhvP^VhnyCf8nf0w@L6WI%{Fj%(BmMVFnZnKzth8Es6>&F%(!5qMsv zdp4JY(=8wrlNFpp6zp~z{+{Z2s-0gp4H}Ulg$3oc+yqR%``U>WsKCD6+TLfE%^&1b z;miUbzkJp!L&>1vW(0x6ad<_QHAzGq5CZ0+`ZrN=M#d2n$~k z0dI%HZSR#yCaa`9-|z3%#)xH2lZX6K7{cdrW2uR*HcO(EP^|^!B2vY?LA?yL2JSZF zIe6%nNf@om@{D3HleLZPL*stRlR{qp-~60O{O6BFAvm@FIzgFc^-P+2H4yW$^*v7ku=HW_rGm$xKD+E+)z;eg2D{5fAT+PL zy=5b8G`*xB%jHVSwgnsz2-pjO;4*Q69tBp*DIeay0#i;~>%UDt5aOJ64bF^c_B2;D zMNTs;!~xvKT0j134t~9#mv1OfDAh1Nx!i&Z+&ASA)<5}~E#YCAul1ZQ0k+HspF7Jd zLy>+T3BI`N7~#`t1H8VyAXogau~q z6S9}WC#tNgsvTrctl+Vw1LE_r`E4kGw4O35#0Y79W@Ly;k}EO92JD>7@ym`gGRvE5y)}Yz zNykL$549ASwAT03n2~Ag`fV@vw}$qJT3rWq^s|`wtGxr%-~>zSkYxp359At{ax!Z< zJq9t{#&Cf;-pX3<_f;A8##gx-=+h17IU%F0=pRKPoyPY3RnQGMD#VayZB5(tv-Ir5 zU7?FVI{FJitze7MAzOci8TYhERBN294YZ~M{5TB@x*9JQKHBZ@sdM!*n%3W=}tUER3_>Hy9miluibq~anqS6 zw=*c)*Q6zNjTXAv?v?6!mnbvLE1?|(@EqBq}u*Vu|{TD+PZ+^*j z_sF4mS}vNT<>z+kqM(eHx;M`IPVM8VQ!D%vA6LTFc6@`HfcFiSu-Votlahg5?0W7@ z6GFaO?!%-H$mm780d`5aEfEHu0zBUgeYgu+s_PBP_R?Qgr-~;#u@0=rBeckExIH;2 z6w%s?cKt=q(@gNI!FZB`*PBAxvpN=bn;JZGwd@0J`d{;Kl6yEM7E{1!KN;CPlq-=xBx6lL-_|UjJ|> zOHg_T8Cea4kH=Ie`_(HgR_s(`v#L;ig1eD9dT2&@ zH#}~{yrU_3C%(gtcM%`E$(nGRrs=yiA&C={AhI%D&Y-(GO*v@fL#+RHXi8p{z#7E< z#9EsV<9e(Q&iwY_OvKb0gqY6LJK{Ex>A5&hG>^%wJE2cZw5;53WKxO*&TX3B#5SJ9 z@>`$WJCA@a+-Hs4f#uCv-^Pqr>~3YN@YcZ(P;?jB_SLDUIa2zXrZ0F|I6~SsGjD;t z5$-HAZ;O+9-OFdLbdr6b!w26X^Svz)$gPwax!uMOQJPQ>*!Kg1UX&0tJiT9f(M(jY zt5~#Jv(z-l_|?TR%(rK14c0zix3Rs{bv)fhML>OmT!iMX`b{GFdy_vs7b*WP#QsT&TBrfMd%Gso z($RDstP==l8YlFMrkP_EN7Ih6a1xt}x6nt^ssg{pak>R{v@Oxm>dSJjKg`SH|JYWO zFZ7kKYr79ipU&Ho$B7<{?!rw8R>EfMQoIOVN@=kf75dl7ZhI66cQ&$wjEi$hYZ(4Y zoO%v+=+qi^HNQ?Xj)f-Q*4ts~)c}9VZ-_$JU z4Nn^40hgElu|DKvhu`||z4IvOO4L{1t(IaRRfoDvLSuHnVq`2-H4BS+fnV|zb*Q?t z?EddGCQTll6T_r%xuEt-=M+_rvezG&i}MXTi+u>+{8@bKCn_c;>3gUDj1`4d(*C9k ztZ>DY&x-jw7AE=ln-}%vhc}&Ah#B}f(`m4e!#~5H8DbxHe|XMQWy)pO97O$i*4pyd z8=b!kdRH%BO!C$S$TB9Bsv9=W;yLMV+LA*IZZh~t2q&W(3pHLxZw!<0-VO?~ipBR( zx%(0K`+XKvRc@>d!2}x*Bu%JG|5Z!lU+9TX-bqI zxKD;{Lz1r=oG*(KM;~^ttEk6cPiAfZFI*kBdew8{&l+bybu1AF-W|Bd7qbf7ENo*+sPAL}!5 z_?jltvbN=ew-dJnvxF-&bU%Cj_R+8Gcpm}X<=oQ!*w_3)@y1JUXB9KwXZ=)_>(jt3 z*LhRD`cfNKTUA*Rl@cL~OYLUc)T>hhsK3Pg8RF8VWLN@7xl9}+<>>Z|tx-o|J;-C& zk~)nOFcu2S@a3->nN{+akKDA$dTPF5vZ%P>tur)%2cq!b5oW;-92|! zc;3QwV43}t9Q$)X`lFJ(QEj4WGJyhSu3qw+CYpT;WOxAf8{c=~5u=z-Ysg#M{%MLC za^cgnpQqYoo{L(GMDRAxV?)(fWqWSkbzR#ybIVlMWEb(jE+|y1uZ13Zc+M2oz#EuO zBN*+W2pdkPWy_teI(Oz9;eW*OYV5M_aNf1W>~xJ7u#U=2sQ^Go#KLrUtT4(s^zD#z2Rgx5VtGDpHBW)z8iN)IAbCso?O(}6J|K)`w z;Z>ZJri;8D-R8qBDbl>ZzD^VTP4VLv`ZQ)8^_M!MfYmvRFh)zpqGfFAd)}v?Z#gp5 zjXxQ!eepE;*b&ks>*F6cLi-?lsZ1;k@3L$B=DS{ zB-A>B<5#xZEUFG9ly%>lc+2{hLPSQ`^5v&buXgpHG;HK$-7iXOIQBRFXt?Op*KSf` zEYS_z{YTVUNlcM0h;HT^VIIG0kyLDyflHAu*g3JTX;vj|_kTB)kIu>%bhAVO<_m&r zMJKp6^4-EvC71uEKnEPMQ!>(_n6^0mDScQ_YuJ6$9AtQ7iUP#KUZ3%rC7*+r%yaaC9(0G8#*q_u>L#=+NZ#4%!i*=YtS9P4Ys-i#!@}wt! z#K=$=TOhYj6=f$d7!7nIpedXGyDuj`g-!@c7wh}rI?*Mf2m1Gw)Mg;hp?N^`arj{; z1#rszw9Ha^{AR-6-RIo^B`WHTRs0q31WoUK6p*hoj)L2c#`T)gJ}h%eUi@ z#840X4h36Y9o}v+-T4&cUS!V?MEuF}9Q^tH$&-ZP$K8xBtm5buIY!;jYK^D71RJDJ z-&XNQ>lMoRqOfWH$j_kv>!l4tHmaa_Z#X%O_Je$K&_SBoIjzLu?2}Y8A&L>Y*xw9^K4C-4YxDIHY zf|hpfVB=UaBImM7$ZJ%@ z%*{Q-1}m5^@Z95?PE{Xu00PJ0HzJop&+<^=gxs>&%mPyh_&_&=K_HqEhSmGq%I}P2K)O*J(0GF1nnAk!uXkzDO<9!CiAU)9IFpwdU_p0#m}#g4(Px zGO0Rmw0l@`ffO81ipV{{`bPS`@I;(=IMJTWqUeS*XfBiE2?^j{zw?j{Ot*v#GtSk4 zb)~VH#o)d@E-*v`XI;5_@%n(}?SJPJsW4e*l7Z7@aHOqjFZt^|)kj}Ro=WtGh%Fz0 z<@kfjPmTEa;;mZsMvWcj&+4SXJ7IlD`5RegkwKQfFrJoI$X5nPrj>72|DW`8%gEd= zMautL{wL$&JQlP)7Bj>E)uzHwO^pU>{jLd9QfkivlZ?KaMgDb!S8G1DRIS{yt<(8^6Ne(Mh|krD=hjk zaAz4Z$r_ypz0}Z7I(=n`B25f((!^V-=zl}L88OCbEG z5|Q)WU8_ec_WUga*z?`+M3XQE_C~kzx$dv2t3`_b!Cv&tyW*(4AMu&ir@w8KcT->E z_X(eNo~m->&sEeor|UXpT4j@pq$qdB3sYm=`z+FUhIl^MWsG!vj%qr(NTaq}7~?7i zs9ou+qNM$){FPJZ&i(MZ;!dq(wkZbg6ysESGg5;1h%9F3Z1QFqFB$I_VsITlp7^`W z_Q!>pTc6k{+YfANBfRkPhRm9N@qJd^ zyL4VicTtY(}%NvfJg%d1m8<_LkKc_ykgy}QsL6_sTS`DZL zN_PijMm~+^`f%r8bzZ90Z(0U&685w>kAc8{T55YFVf8DaCXAE39ZIgbJiu4Hl+;vS z0s<%521jRht5TIU1D310H7)-uPw!P4(|w>dW1%uwzWJ}q@+w4zuc4*WCdk4biIyd$ z7DyTJ%+SQ~?S6EvIyw`BuDePCD>K+)Lfc@=e^~D)=pr|CfbKsxRGAZhPKeqitFe9J zl6j(kPEHyu+R|L>U|nXkRMCqzgl#`9UjDw!NTJpT+JntnnX>6#d|Dw$^3L`1ldW?- z?7a_U>!fY-Uz&CUUch~^1m9`E+qm)gmj6DAxjQuXr8WKRK0mA=bYiR$Fj;0I5|C`>?g zpyoMk>v-QM`@(`OV4UCPL36?h^h)E-2<8JS$pa!-OIuw-wXAEzHHF1~kD)?SbRWHQ zT3VEzP1$mr4((9tzRRp|F+`1CpB2#*Zf5uj{ae;Xw3LOMJi((l0(d*1Gp;LKvi~6M z@kVmB?<=8Xr_s{-m@Rq1W4z@k)wl@-A&34^;?4SISczKG!6x6GbsP%&7g>pm^IxBp zW&;sx-GZuem46Pa(!C~{bRWuXQNDZYUU}!3os}ZF6G`y75$yZEfe@IT!9!S>l%R4D zrzdsZW{4rBVt!QGWoB>Wx%4gQJ4vu#@p{o`(r=Bn2VF7Id)E?PDXXxaDM2^1Yv8dr zh$46YjF3kqI9j4H@_XEGJ&_R(*-ij+DZn|eS;@OJs=DOwhtU1B5-3UjyRV-y+q#DG zL?^vsKO$-5?}rigeAuXro3XDCi)}*x(nlOfD{yIOedxy8H@hM4Th&lrMd^A`2I)7T zs_{MdW1Gb$CPsD}xb(s=Y!&tt>#&cpda*1qEfSF;83+3ic@{73obsBucviUlOX$mi zyd>1i!)hWVada7Ere~WdDn{ow$|Tc<4gYKqog5<#W|GR*JToW;AVKaEsw%?d(+PHf zc3dW}MIvp8x&z#n+=S6b2MJ?}XKV%_X;q`z6C&d;)3YdQ*Cni7{@o5O%Lg3;6(Z{z zPnMedz*V?}w>Mzji_UzQcAPILzAekB)g#wIr2fOTpn|h*D(YyH`F9eFhRoZ50LTk; zUl5%zto z0{JJMNrG=>o3$TyIJyNNi`*%JZa_n+KcCEaB^FIbd1pKsZk z?k<)T>P(uPrSp9+_Tw~Av5}{C?NJ&wFR}p3agzqC)b!}grF|nl)IK9W*cfGz8E_XS zV^!3hlJBAr`7s#Z^xQO59W-h@60gp{Iw&TIH}jb-z6(mG-Td}pCpB~=iImO9Gn|O` zQrx9;ZWWfZCq4=`RTkZQ2e(=s_-Y2^TgKK;Pml zb^hT07G(TBOF1f;gm3BPlRibfKkF>HoZ4I6gwzBcPIC^D@#O>|ALc5Z_=;j(AqD=? zIX4Xbt-S;^ub@^dAlg*eOhY<uLFWDdhJ#ofkUHtv^CPN|`=0%ZmT^aV@enL9Ft2sRb1bw{ps1_b;i#)%tqbqt0kb1<)5{dJsr_D_TFL-EsVCw=&wOi1P>#gJ0ZN5!nPyJKkNJH7l9UarnA!t)aZ z2JK66CeSK_yL*du^R5oiDcDWjb0=>%S7CV6IQEF!U$-cL2de`>`dmgc@=mzT-?%j^ zGeo`2$=)Sf4s8HApYOXVq^y%|NvO6vdEWV3`B0Mo=lh?UXs!wpoV4 zU`4$fFJhZ()LVvxX={CBQ{JL@D9=Hw=YxL6KawLc&RM(^{VEX#f0rm>nm@nIj@I-k z*(?gwXvG1jnx*4vb9!BnXkS337pRMvR5W80RS}418(^?eKj2yyieMu>y3ZO#4L7pn10y$gc5v;<;9DmOFV_AG3M|?i zryVf-9AF^UfRCQ735VBI_}#uB12oKj7t)3}r)d|B!;6#o>k$z zbYDnJKz(^Y55EQ{W%g5_GY<@Kf0Yep9t0vJKNZ~!=Wuk=RkfX!mI6p2@zh>j&%-m~ zS}&{C4>|JLpbQec$b@Crqg z;-%n~0%!T|{YweX_Ll}4iX;pWeZAGPLV%uc(W0U6@4T<5+j_zBARqilqI_iOC8+G% z^IyZ14y0kNjQ-YXb4?tmkK!h5O15Zg)gJZP|8+;QTqfeG2P(m?;QgK7xROG^%W#~x zc7iJG>tAkENdMFF#x^1pwMmSVtg153KUlW3N6ulb5eQ;m_Xq!NAU|MA+tp0(fK^iO za%;X^nYmmU4R^4c+|v4>__=D|;Gbe!;o5YoQu~(oR9703%hG%)zRc@cxUu5Dd#NQD zuHh5cRcCsmxMe6s^*yeXvLj znWUd$_0i7ix1QwRKVv)QD4PJWK&0#YmJ>|1!xu@;G0m7 zp@IVJm|O_PP}Tc!t-5BAG};d3?(6e3*Sb{60dFqwi~P&$m1%bPyiYb9{ zM^PzEpGIHE*nrr-1vjl#D`AKT4ylK8r^>=zE+tqIp3hI&3R$i_>bHh&IT3mwKG|JA z*-0^8nF(>TprMz*43!|HJMmH0F%`9}Da!q*4{1mw@=m;f@;WkUoDgqQFo;5dnE76! z?rl~nxS{@rDD3Bi$+cjtfFD>2$lahZz>%nt2!EJaxb%%(b{kOwSL0M5As@hvJVZV@ zqPIT~akWz$aLIpNuJ=FGUoLrQHT$0IRT>F4pRS@kyIbCb@}P1Km_I3X12WgF@-7pM zTFE{fz)|s|H4R6r0{$$rKb>pY1xb4(H*x&Q3B&U{YOqX%o7ES_Ag#0%Ja*LVT-g0v zvtZN*?nK#hD7|3n>pcl&{b{zejg}Sz@1Mu}TBH5IQpKnHV6(M9k$Z7U>lV6b(CZ);h-pK}Ql5lw=`24uw2Jh z_^~~=^^MG8)x5mbr_+tT1=D2$==`SSmAhO!|0?A*y?t1)QzHEDwz@-v!C7#zV(czV zczP9f;W-?f7IDlx=RQ=GWi$&Ms~R#F9{+CsPBYU&D8b~NIW=zmUs$>ZLpxT(+M^Eg z0DFuLYX91J_=89%dIx3KUwLl9eBzXxAMbT~UrFnY?!vuXOC_*20KW1bH4{G~30@cp z%OR_?*zlfb97OY~v<{2psR^p|z_ZEdduQ{BI%;zsOf6Oxl{P%1a0* zZd12hWGvuw;eN$*65q;j4&2Yo>zKOX{Ls!&@7yJ$z!t`1WPhuXJ4SP~D|%})#1lGm z=3DRnENBpA{Tlz5*whA%-LGYZO~ZvDR(ENFKqTxp9od(XjJDA) zUi~MH8B+{zMxI;)ERTtyllu5WHR!8wx1OBltG^Brah(xL$b5=C^K0qBWqFBAf}~2? z`IkTe4eJKx_0C05rt>gzZU1TfLDDe{J_Lwjqkt|ia&A-5#!+TldK7~VehX(h6ns@8RI>Z8NNTh%2pvaOM%CL(Q`<8sb!E$k@@i`b;$>oULnEf~k#gra zYVf~wo_~)LYo`MT6PAeG_9~xWb`N%NZ~jiwc1i|o*8&Pkk2Uh7+ojmUs>}%FwSgD} zslo%q?&3Tc+;&kEiE#4Qr_lW`kS@u|Q(ep2Z8WLDl~7%JR@0{dYwW5>3apH8LyK-Y8rG{~Hy^duwkX|prCNOiBZwK&x8skl>XAor5l0X`MKp;8pQ; zM;=}*RCT>trXKFM&xfjl%26l5n`rcZX>`omXGp6Ncz5H#vr3;pFMN69S5^N@FS_2D zpskSFoV_B`7kTnTAfC((T3*}-hx%O~U`pC*hQ&3WkQx=}w!M}XIpbd7a#_0=_N!ch zj^#@~pObtIh3voV5XV}E-CZdxRHo8~Y^At9tH_B6=v@oyi3sc@GnN;;`}tfdO(Unt z`879my3JKXOHS#$EHU2a>NMw&zHM~v)i+07+Bim;JsEGlL9+*;`51FhQf>2_#JI(4 zJ*XLFm7W)wKF8Br1Twh%omt`SC4uw{l2YJNY8Iepy zgkTx{=<#a~hGSeTb(b&R0>oZg0tdFN-vG!+cm^smw*5Ib)cAM$x6*vpM;inntW?Xi z?^^qCQ8A?IS?MBJib} zc;t}gC>t?;10aJMB8n-Wtz5gkh4x`1Ik53u{ZM5$)^%Lb!jbokxKz({tF(Y_$D&nO z_qNa<7u%g%ab6 z6=iQ=4*C_?Dk(`OuHCG(p6lqIcNHMPUIjVV!2()+{G6IIu76?cg7^~rQN+@|sa;t{ zUH)GS3Z@kHka2_m*t^God3kBRdtS4SmR#Q@FLT&cBXxG**vqBZ5SP`hYKr}1vmTY_ z48Pva{#ki{XiQf+qX)*5)UBgDir{~rh3&?`nIMDjC(bmQ!AZ!RHa&e3_HIeerIh z*byOIe=W;z)RM5d(BZz&0H2cg6Xw=%5aeHs%zee{kLX&*It3*o^UmZ!rGC9IJphD3}!UvP|2CTo|lLVKT(+v!wftq=v1eJ2yd5<_w#%yB5p|SO(!GsMIbJDdVPlh^s^A)9kfme07`L@2f$3-H_C`h zYco%NATD!ByHrF9j*vc5BsR@jW|3D^%N6;@6B65qa6w+r_AuH~wTDbFxmMAJW>7q# zuy66lpSmVn4Pxb7&+Ynq*E?D>Gsm8LgFCa$uR7iK-W_lHXLy!OnQL~| zY#yn8Sju)umpPo+h4ww1EE;A!xLo8{!rxYT!2xSa(unP;8adYgGLf&yJCB|&<5Xg4 z^Z$M!B`dY0TPjh&v!7cyXZe>_B4TJQw5!qiZe4NX%jOIoEdvR|3^@;Ko}CkC06<|V z^Up>M(#epb@zVy8kp}Oo_7ql)!7YWB`o8(v@-sSpbsZtrLbgz$}F1aE6XTvFJ zq2r1!UcJn-U%whbqPt3ySr{RV5KJ7`fAW75?c%6U!3mseL}oniz3b|SY4Ln^0DQqS zV|OcDFY2PW!a&ctMd)0n@bY&7O=0+z0#ki@jT**M*@{cwW)$`Q2kbwOKVCO#Q#ZLCe2zXbFZ3V@pX_o3k-WJ{dRI1sin9Ok4!DP6GH@eGPW6M+^$Yb6 zGlFDYm|x}_O_bhCHXr9pawJ-l_r1j~H2Z}NqqprF(Cz;brazZ8;Ef#S=3=ZT%>w0? z>BzRBBES0nvm-4Ad5=sc?$`3P_sz~mrE5fDvTWMZ97sK2h$sgQtDw?#dr;3GEtKa| zA{t7S4MjDTg2%5-qLWub&zrJy z-nWF9Z9&{7PL{yT_LrUbBP6GV&I-!#MP6lP*8))HFL^m~G=8AucO>>AlO;t|)dM`D z#?crw)#j;_X5|2FZgp0ew#-{w`@8W%$F}gT$+p7pHezhy<1KtGJxWp}IoAk&?XV%VI)5ZkOkJ?JRc7sizO)3ut| z-rk*&7!WYSW`MfQ69wQ-C6gZ=0f4O$mMQ}#iyObvUe@+D=oG@4V0jDzEJ`MgWwUpwSw zvUVxJ$_$M_pU^dK2{6*m2V7Jbt`)}uKIz_*M&tByWe#Mw%kCW%27gjfQq#k?`{Dc* z(@*E&He(1Rpa9;YD5?2>Je_wqo9`R;laL}Pt)OaCt7fTHD|YR@YL=iz>{6-{O6{U% zP}FSg+Nwq=V$|NF)YclcYRCKd{@(Zf$8i|P@jS_$$8}%lb)KJFA=iaUtO#eZ`y}aX zB{Ag5@0q9o3Gb&GdK8X7L3usESr*(zGA{{IGRM*vgBX6 zJ@S6b72nT~Rg`^LYBi^Ld*itcQJ3w?xFhJL8dwaBXmZ%hUT&iHed7@5==jWy#>O7_ zBE*+mn|1GQ>JNzPNb3coQ=W@P%b%?gx%2XBz$DdF?l67vuv!<>PqA9tpw~}0=<`yg zOW;xjdG|UtbL+%vrr(tasVq!t3N9&?=q(z)&%8Q)7et8_l8~&#k1WVQHQlzDy%;6)4-pStzsdYh*o<<$!&> z;eoHrl-2NiRDxOn!36DZ(^+H9Lwijut3@@j?qp5u-DdaA_3Ye0Ta_s`Af=)Gg zW%exBYlhQY%Mj=(4)U4KmRidx$DpODvFw{8iKMSSxa0Si3b?wxEONuy|CV;y51PEJ zIr7*$7`Mk==*m?26S4vqq(*D&;D%5tU1e;FEZdGXidAf$Z;XuR)UX*-FpQ8#d?lW7 zGz;mEN>sLPoSS`%TK|e9w}JW2kG?BtrHl9t;nt>%>kIh)hcqS3eXx-i=v)Wh&TAh65^wepHly&PY1=?7_ zf9(xxYHifyrtcp5OxXbfbkK!jZ>u^1Ce!BwKpivTyU_BwXc(gHct$kXAOE=;2;}#- zTgCST3L;b*C@K}J+lz}9uOv#L?YGXF9)x!jWVI_YXC_vPu6+!T(~m($Gpwa^N7nTy zQE~j|n~9E+({mcy%k}Ks=5JPEY1-F7|5N|AqFoozu%aE;!la!SW>^XW5*?Si*2g{m z$St6-;o$r=%7q)}FyZqLxBqm;wlc<3cfmcvsOk`HW`5|KrHh*ta>-$g9+VS5b8;}X zNijKZ=AIOM`mB#i)TZJvxY$ez8Q1o;hkZ=t1%ZZl>Uf|@Civ~7kkca+y^KZBtMlRU z4yW4q5o!$XxYb{MlILx;$px0xpmyj6ws=$>Lw1x4m%0yIFtA#Z4q!& z!&STDHJv#j!gQhYHq2DD=kfFCj_;-gb!r8X`at)U&i!;+Clc~D>g{^J^->ix6^s&f zf#rqv&6*bmH0=MI$SVpL8B$OuX4$)(7$5fpHn1|nwxn7>m(mj2UrqXtq%X)9VSEoR zRAs#MUFT70HkC)+i)W9@|CXo<)dA~$LzXoMvmCnVZd+zNs4GJ|Qn);_k9zDhgAPv>4=R8-gth;B9$Hgw8y3fij{ILc zPy(m=bU)h%3|cxNWuVZA_Oh58Ve~K01lAj6?h_zk=GpgevIF~!^}ThS3HK|Vzna4h zR&cZza*XD8yxzHNcz^Xf3SHXE9ZYFjn>0c?hQY*ZiO5on7%(4AQ2%~)U(-_ox7H>< zwMgWB>*Z|@-n_#FZXUyUI+s$^eV1Io3S_U9RF|sta3?N&GQ)ovC_BK!7;tPShZN6< zB{OLo&DOm-@^An^0i+*aU9C8SV`CtPMrdKA4^46W@VTtA1K~>ur|6Xw3oj=Qf{+&W zQW%Kb^__-MdWfB;>o;cG6ni-19NOfkhnkinUh#AA>an-A*G4_!Nce0#Q}~s$S7k4C zQi-m%>TX8&_jZl_U^mXwTY4C^;R*|$kG!bl&0jtRWwSaIj>Tb_&F0JJj?vvlJZ+^L zCNVKTfxMDKi%x=n-KQ1D(`wsgLK@HupOyTnNXMo?VtD3{OtVk_s0C=h@*qWQSX?(; zX(eLcz0Y;Oa(QSUWp7tjs};%FYrL2GEH_4KI#x28$nhJh`~;W{JN;-i<$0z*Eilr7 zHLP=ImdONYDWfO&=_OBlm{7&(LKZIVTvla866otz2culFThlgz*Mv(F9YzqOG*Ztyt0M^?VofE;@{BK9NCE{OXDI8Ckep#~bnwHU>R+`1=c zhMVHS10Lu9)g%GeY2)jwW_+&hI&S?Aesujn&l1s@FL?W){rjU)_vHGrskz8TX;$4P zGyc7C{!TjILqVctcyz<(^@sB1jv{bKryzX+`kU$0opcczu{V&gpP0h;Tjkxuoh11{ z!IcQE8LnL|n(%$URh3FaZ)yHhp~=&qG&a7GPVff2#ob252-nJ4w&t6-jBK=3;(+*L7dV*Dwnmd6z5bCsUAS^o4q9Oza_hTuM$v z5GpV1aZ~x|s2IO1gUV-A^T10@)p@53BD67B*U&PgY*4maqnLof1vwoF+gk(y=<(V1uXd!VFUK`Ba#ubM7rIdzEKgLt^<<}1;@dKNrk4s0cxm{ zzp*b8D&%M@ji0?y+NCvY{c^k`xixW8JZ9E*gCV{LaZXFJGaZ)LLmF}=w8ULttL5@wV|f@3RQO3q!6IUJq7naztea5 zN1h?fKxn>%NjpDmjP2k6r|@ald`i{v=`FgK{P|`2l^ZYVk+usJ_~{rPD4(Bk>46Xg z)>Uuun;<*0iw%@o-k@uf+g6cEc@0d_V2(_kXjwVnx5)`az8{&|zghH|Q@s#1;*<-F zxkaH2mhy(gch)DKucz* zS^DA#wsd$a72_i-lz8d$dazrPpcD7x)8||W5xZ8B`fUD)(kD0?24fMtMO~k!i}|>v ziU1ev;xr zCnH8VZz3M;X7b|)sb#zJXu+R9SDkT|ajF-g-Z|y^M9Gmr8_p-QSp?jMuf4(*zyNg@ zuWx-!?_t01%?QQ0%z6a}F_u%YD^8Kh_5D+uAlRqrg;*AaC9xl*wWP}=1e447Z#$6wzc&+hK2lC^+omjzcn_lxC3km@aRltX%LZ*ef~Z$d%O zd3a@o6d!>+-?x;Ia?(f#h|(80#bN}{Z|Kf)(t z%B=xFpRgcU{WtqQuS8b`HL_E(I-h{D+X>C?XgiSYM>zwC5%VHztY6Eu9KalQ&&Pl0 zYb6EOseOzTHoP!O3W1ljcNi8h|7Y70@j>j)91Nve$<5qmNv!v{U1WbHm^Mj`RumJ=bzm-Kl!mG ziqHf*w5RMmCvtzNuqMxtkWFMrFt0*tru+u4y?vf7_j#0CFe&|U(2BbJ+nZBl+TU)S z#6Cl^I*9%9V9+Vja>lRXh+i$VTkTyE!v79psf&Ij3V?n;45G|PI~zGdfR-xEL-+5~ zyA-2}pXK&bqm{LifRc87U(j8_!9S0_v=0hH?_3Y*Uu(E+b#-PbkEi0==UfoU5VGf} z49`NSFn#4+aaw*&$h~`Drcdc?|MNu{|R`BwltpaK67vfnNSB^o>sCc|w&&{bS1qYKr z$=eDjRsI#GlWMQFdJjYY%-B1{A^ksIG-7Y?hLZ_BSX=&+;GpM6cgA$WX=U87(5h)X z_kTmZre`ojn*Uk1LDojqq*ABl5Fa&~>amqJ9~rc3ZM1&j)1PBut*fug1yQZNL1+@X z#;~TPH@0V~M;=dXvVzSk%_)G#v%^z;tc|_8l1s)Sq+j!SQ<=|pYV03nQfxP{UNQ`J z#cczuA`isk1gye#(_{MLha;MgdFOYnIeD#yK75W4woLtXsCsB77SM}789e*w=28oLkPFWs*oFO?kKSonpMiXonuv(?7o& zXaQl{!v)!LyIE$v#jmvGImTp~MI^MF16?4=pHIFju{l|MoG~zL`j9bIvGA=wDEb9m zOLlW(U%4iSy1b#`5g}R17uL&YWaoV7C{73l3MIh!ySMrL{``zR0_3&3QkVX5<kOmgnz8nqHcn5g4pYr<_FFbB-EgHWKv(^?VWqnJoui@AeULFU=F{%vy#xHp z{7l`f?M-Y?vo@n>%0&UyzV=P5S?%YIdQ zC{W>2tp^+Fm=W4lDOfv>0z;eJ?d{^G!ML>3pzQwkjroPbSz9oclmdT0 zP?5CyFuQ`~fYE}R{@RrtPqN)i4iE-YBzenOo@Pja{*;pdZU_pPBJ&U+&rYP&YQ5=7 z@so%Z)idhM#_Cs6u3-FgOvcRLz;%Bf4{|RWp-%nKzz8)7;uW%>=qacTHS%nw@%z=oJ0vL*fl&W&kiUcG-n{JmDw#?MG41=d$KI68@Mj;%g ztCvRaZG{t57AWffA^jA@Vcw@W$Q87#du9A>Y5lX_nMwL<(RJdw%hGelIYhAAhFYuj+3{f8H6;w_ZyZxm7G81 z|8}Q3zbq*%UptrB+qXJ>XL1?lfncHMl3qs(e!XEXerZ!%U5fkoN^T=asqn;3om2xC zcssTGSi=^8G6-D;>-S5?y#HHzan)Obzw_cE|LKu0!O8A$OIE!9VO9IANko4)37rQc z#Xx(B*Rp!x6-;i2Qu<^VCdw?RhDPK?>L-cc7u9p_%m(~q52M&9Cx7Hi=3~&bpU@h>j8^wd{ee94T}ys2QISP zmugoM9YkFXsyYw}P+Zgd5jF7zCcOU6gHnLlT%t~>eChY{7gsRo7tmR?oqgcG1Xk2O zom=a9wINl3$wj27UM~yLN^rT+b-))OEWB*x8+!gsfQm3El)~waRqJJ-eTN&$L+MT3Y`7-^s^m z!LQ;8mNv^H0~HV1Sk$g8Jw<;8I~-CB`%D7b@2guv&-TaLG|){~?Z?bbH8Hryfmh+F zr#c3_c(V9L3dbb5+x=*g9jdhx5wmqJeWVHfSUKa%yRGn)oG`O7cle3fT$`sC((0n3SHdaFe8DwEm$~zZlOZ_#Q;bgH^-XQ1Lx-I&z zT@UVQ4Or}|*8I1QxW?5+ukXXJN~HdB_%h%&w*iOkl#|}hz@%g5uXOX}ox?_r+yw); zWOKzY3g1YI?9lJ^o8)PCG=7lt-|2HDgX+U<_E(vE8tx_YY>k;qhCS_3PU33|&B@_rFP2hsZ&N1-p-;&W9Iv&WmPG28LVj=N6(D zKfO>A_PT>w9O!Tmto^f_)~}me$7Y!mT^CvT^t77oH~EGzg=oX*x&|Ds?%6M?g&qpm zX&>OAQFuM~q_hBc&$0CV1!to26GF*&4f_(`*hWBdC|J0hPA2?fc^8}l*1iO1y?%#3BGFwt1?#b=v|H}e>W%-xT(k*u$kIcc<= z>;$E4V*9I*oji(eqpM8Eg;yH)b4HGaz#xy=pP1ScZ^k~F7d^WM(E>WRlzMh2QC+J+ ztquZjcw#iN(iY+VW!AnN0TQ-DA@|S;S>1Y}gXqP&UB>z;3r^&Ii+CE|CB6}nM=u-9 zpf#dHX(8C@xfHC|-%$GMGl#(Dt9M*tbza!&rF-dF4|47ldF-6ucuX}MjkR=dTOl7Y zrb^a)=PIg4qPS*c?Z7V5X)PGg00PZdnR}BDvm|y)xT4$h7v7u?s2C2l+@rOu zI9{=OSMcjpsjdwVMp1EF_sD=OF%K6cSXqo z)nits_{>*Q)D$u}N-oaod^*oiY^SQe6WN<|&rdzc7$uCO{in~wYPiPMDqL5y%^4Sx zff4PZMTb?qSsX8{h5HmgK{1e3rG_;`?i;!%H%>=zr z1*&RTX|+zG^r4=zWk%^E-O9I_IwS{pkJH0-K$Sn3H5UtLxaa}`NtG|giu~85d6BSL zSEGe$nK}|I$XYj+{$~L`C6q6zOzCHof^_}^5fL$Pj279eTff9u^WKB61%vlO$t|mg<8J>3t*~%&26C#a?=ShtaGlqRAyKD$KrA=P4FOJ93PrJT^}KP zS?w7B|+iFe*w8T{vJ-sBSXEzf#}?RioFL6Cj0s(oeg zPYfF>F_KeVchM$4^7fyZVt6GlQ-!bn&-eFX+(l?HZN`n<|Fm)-Z>5Vl$#JKGRVp~} zl+;q4WeLgv))2$6e%z!{K!d99Zn@wS;9f-D)lzu&^I28#S@2Fdyx@$dqE{93`(lwggx%UI4baQ*=^FsL~Igr?g6 zCI$a1_m<`fkgTUmy<_ih!{V=Rf?=aL*P0soF)GLip5u1#As6I=T%rbj+C4TrhL5p$ z8#R%JF}ZENNB}M`p+zSmTRuaBEX-yZ*4@b|T}+&WRV`(jRT0L|bhW?n`1QfPgvw-` z{_kB9=(AcaU`kN<#jH4T4LJU#=wVcfA=Ea-pcxLh1uUUHhMhbdpPRso+0$WD_aj-?fWen`Eib;|O z1o~XWS9h_h>{X`I^IGmp>%0x}7iF014!nKG>BiEHr^gT3pK2(81)08$YFd&+@E}t0 z(+##c8IOaM;MaL!J&akRpkB^#X#bT{VC&1D04Q*$TPE3nI>BgE=FqD#j19)}?EQxr zto0&AGkf((T5-%-wg|6wMv)~ZU_p&^ZG;G4pvnk@&*(LZUl^ba3IHoq-KPL(pNimMDcJ0}uWVd!v zaX9D+eWk4bkd=|OSXt@*vTME+_D+}fUMk_EYIQVA#`NJEvJS9|Z-((1o^?yVc8D0e zu*@?prw_x8Wlh?aNeWAU;-8Cn-U~kFQf{6Ay4!Auld;l+GoAO;eq&E+ew>-f<$+j3 zF}l%*gN$+ZpHS*W(kUZdKD~BM+?AC&lyV=n;vK01X0?5%C8SoZylBn8x$n=`ZDwEi zR^W!hx=Th|Bi}32++{V`5X)>KzPGs$ksh1QmY71*dWU=!>j_+)3RlpoIx^E@$Z~OVj_rz}JmOyNo@i2+PxqX#nyx9=eL1|D=FURo8 zfjO~N1QW#Yh1|~wec>h(H_tjbe{Ylc_T@LQcE^lgEDy{3ttsCD4NfVbqjjyaD~N3W zS*!B!y+~Q8PC4@Kv*KHi%U7t|4B6u?dI+bDdD5C8Q?Y&KfUECf_6qZar=f|A&hj}+ z-4f9$dd&*Vw$M7pggwEIvtNmC-kl;4ZXyUPtsK=A@CI;LA&=q|(;=a|x4mw7+!b?s z7f$#VY8{cj z7059E`cC_6@>OLI<8^EpC|`*LOprMe^GPT6<{VVjW@hT7*fcOWH)jw_=eF@lV@Uei zJ^kkw&=iZnaPIEY+|UDhw3zz0|5Y*|IQ&{uoABI3OZ>yUJx+)bI+t=OiXK42MOrN^ zXA8uU7Gq2$PUJx@gSagL9IV1~<0dodd_N0`sz**7}!HI9|@f%H)-&5m_CVpTIu3KDPfY~3Dde=Md z_^ZG%cqjB#cB;zRjMy7p;QBrTRR4+pArK-FJJs-Ehx}@tAnHjA3NHPNPdo_2Ia>wr z|F2(qm}h>ogxHZ^ENFtHV7w`{FbvipzB$GIdtYQtN6yqVQG6}<12rtb zF0VQ`sLsHz^2A$2CR1~ds|aL<%6JPwUh^&DjV?EN5XN)4iiKWcL)LcIILPH^XJkH{ z5`CqS9w<8PT?fVf-AwEdhTUOQnQbl+M@|VqIss13#Xx*Suc{D}K!BJBVKM_iH{N-m!@D>hi1;UdgjRxuw;%ipHXm_|je_Vrm(4tqqK&gvKs8h?26s8o9;K}h2+K^pJ@ET8zT&j2s=6uI| z3z`O0xL`M+!Wm%H?3;+`etpZKpzbyT7Dem{jzRd?=E?N0^=0W9%X!~vSuci#;uRwaoE|oh3)R`0+jtYFJo6El0g>nM#l}@W|l=3y$zF(QC73*N!WA`7C}tqn1l5l=EN-`pg(FX>&MvYWGb;wTC%R|L*;G zfASVS=6d$GP(SJ3`JOZVIr^a;Q;$W<>Oc}qw{JTPa`K(~@}L^j>A(W z04`zH&6oRoxE<0jGLq&LCtEn8wiGVIb|5j{;7U^|ZRSbNzPtfJLaj+?7vCM4+_xHd z|0_D;Zp1mV?}j(ZKmlAgQ~2GKR56$VI;Q8dD*Gh?`@4j;)4JSbflSs#_N^%|{#_9- z;b~{uNUX-rQk(G}?R;kf`$7B*z<5OJx7n$1R?p=g+EUub%< zMrrM{t`#sVG%&X4!O<)c%z;mqR2`A6MFRTO&dR2Up7PiBUSWH8`KqIgW9(bA<%X0r zK+~OkBXVd@k44|oZ}gtyc|qA1N1~a*;|+Rp0-m8|idCNNTtSaT0vvz7E*KEZ`FA;5 zBKP~3>>vpCz@R1QBa?uMXz1U2L5? zRfe^iG|5DOcPlAG#zA?6K3)hz)?zSo*BA&AyTyYsCq4|MpyQKXD%V;qK!?_xMHWQ% z8hh^PIvMDS5Ij!72aI-j`YfXT1{Eo$8xC;XP@%}ll5TqqOW?1+mh;07C(t(1_(5{h z*o-ln8>Ur;Fiuhn7&24@;|hM^G^L`5y(mQ2j~o*vlYeBhLw<;Ut^U9uACvtrw0}U? z0$_fd!2YFCck9cB+-;-9IS_*AUSzKb!F%iiziOX@PLNA%zI$+MknS>j_q0<6Ffj(a zVqu*3TO$o-;66E9S{c@-^^?FYI!x1FDE`BX3j6)c2_VP0UtHH(m($_VFAD)ZjE(*S zuO(nbHcuR$V#*7EoKOqDvI+uZb`}Ty7SZ@d*s_nJ2%UfU$_bhi74s?Vaqk7y~j|*2Oj_s=fDUZ)lKH1o;UzcwFC!TDZse- zJpicU0eVR~dh@yOJi2Xe#RNIM^l0AziMIpw(=82zUsndidw$0Do#U@7^1Q=F%8;gyB ztnHmM#XH&P2Fj@!ZzKb&-1($ebrBqh=S>88=xKs$c3YuMwm?56I&*_^sOMnB=xv3j zEfXd@q1N|*aEn6XIeslbqW{#fvLn1C-!^EcWZyFAZx|7C3p%#Qb|L<>9|`|^ zkQINcg^;^Sp$xwDfENe>lA368$~9p|)oz1ocB`pjAEn#IMQ0$CLz~C6G?IeZF%IB6 zp8*U>QV0+mo|tkzTc4k{$eZXes;}=q^f(jCqy z)H<0>$E8E^jnGC&m~5nNXteQ$k#ov;5qsA47gTEH&EB;Cn)VcYXs8OFT{ zCQJB4iIF!3&_BSF{K)OsjJomHxKSrU5DLW?!#j6joGJ#o{Rp6Qiknmbhg><7q2BR8 zpU-f9`n-RrGq<_RIoZ+E7i3s0xV|HUUx=3V%=6F@T_4!IaQR;^`;G-|_bxym*0w=@ z&af1yWBd<*ju^$8#P|FF5pG&Ph622bk=7(%>V@4BCC=s*xNaJ)krgE=+{0ZEcety! zA8KZ7_}|T?;OWE6_I$M+DM2;ssH3V4YGy`hiPbn3ntlub){9od>Nf)EC*8|?L*SM zQPX2~#`()|vpt8Mem25q%dYhB>;@PFBm9ERr*6f!03T-HXcNb z&NZbd5HfKM9vpNs4sZg~?8r3?nMFdqv5*1jQ*>sF_)=Q z*F&5L@=0}GN7NzhR^&PlA`SmI01V^LH&s3sbq{({2>O=$5gEt*0n^3oJc08uVX;!& zVCBtq{r!MfbCenMc6~sagv4TZ@}`g)ciWy&!A(S3wNH}X)8{JS6u|ALKLoh_=$b~j zFN2#g#Y_Vh`-!@UKLgDaFMo|ctf?82TH`9qo_QR!4{!kDukOiRRgw$41Xb&`ho*0`gVv zer-qwCH-Qfz33Tc{ z{RajmkE;{(>(Yu#16CTUte7QysE7Ki+}Il7$P&TO_8dLxrfURHvhg|qz~hE zVa)@aN&@9n{cn5gR5>qH1Lf$1r6RjH;4GSG9vSd0rYO-9RcNc@T{^#%70{1X5)MS*BR)>ZRh&NjQ7^#e1~Fo zOIrmx?1!x--ZH(-_HphE@i`J(E8Jix$HGg`5b3Q%NXz|%rZ(X%~^X+k-TV8mH0K~Xl-XbKUWWhob z>H3A!wuZ6j3SiAgkmP(JPHSSi{X>80T(1=NFSMn|X0^EBAW+`2&FVfW#R`(t=F@FP z*++e_jI@KkL(3FZQ}Hx zshnLhcWV9(EeGynv$rO`{R`-NDfi|0+RHufmuX2qNTn`(U@!nXcdZ(TqNneNw)sCs z1k2u(mRupT`6*6+_6v#{4V8q#YqV(8zlAJS&=%yx{jdu*()l)b=Ii?5=X+qB|K)?M zq2UEq4-xdryyO;lKf!(6l-bD!3%e;8S8+j_aQb>B$g{s+PE79ts}DHw1bN8cQ6fV6 zm)yN&pyWHMdfj7{_Wg)7YTs$(d+JHiMk0@vnT7Ye-$&>fHx4K>UrvgRcT8RnxZ%3P zVnC=_ZO^d;9wSu;tPmf{ovzVaW+zYZ77zXq*me9Ajwk6n0I>?M(a1i*84~Aw-Qz;6 zfqz|&r0w|;*~o)|Br_{?>yyfxE7n%s;yes4rBS{lE%+gCe|66zUIBMcibcK+PMs{P ztDmdjHkZ`em5#}PJD;9qkZ~hEqJ(on!ApZGJZUad$SDKe%BC{U_3{QV{YJdzUQyw- z#T*PJTYA@3k3L7T3Omrq2H=u(Z*QNQ#GmFZ2ATEqan_zY0A{>nTHUrRqat|xDZ7n2 zSnWsm>+cc{y)-G+?R*)f)k_B`V*&}%)U1v~$3e?*z zNCQ9a4eGsqTPQ`E92})Kco3ywrMigfz$j}H>>Z_;lRimz!LtO;pBjF!_k~TuDeMEr6cc;%9y(TOt`ki zTkUZbf{aiZ>5wIs-Rx5(e`|ymc-{mIQKb5 zQ(es&#(mOqxSy8`dR?mPm?+IltTI7TwR90=MMU}LKyYvy1z2?V&r~&<2edT-o>?yH zoh}A&!54sHmvoBYa6-wPEuN3WULT|;0jI}zpxhOJES*X+AuxHXX!ZkIPwAP>}08t<6M#!Ji& zXYWp~S|T9$dh@SPnpB=k`kS87NX;7mJ@Ir@NctLJ#^Z{>2P05{5w2n7j2k> z@wvewzcx5+-3iy-yF?tlWrJ1XV4h;1s%;r!bcMZa1$cjow$Xzqrndg5Cu_CW$25rB zEWiIOUvY#}*A)^DDg&_7#;|nfjO%FfX~KOdwfs%um$18p{EXF_~78=cLPxMYvlk2TV41KZ0moCtKi+R zB1j5Pn=o%N?pc*>UYw^8a8vr3)K`+Y3=qY1KRs_)?7QTo`X3(%{;r{KLW=x-inuQ; zCR{Rr(nyao2!@bRqvN@uqVhMB2<9K+z&53x9klDRzsf&;lfDdQgHCPCM8R{2_eZ32 z^5GBFuTV;yHxJh${LfTreDTE3`-x}W04Unm^QQ{nSeb{oi-MCuHYo8cIhGaxT^4|g zViUe$=7~}O^IETi-RV}eK;Vos9eK-Y_Vf5%pX^;B!NaVb&p|4Z-6?&s#TnxK<-U5a zUvtigExpmg|EAQUtTCP(78Zen#Qr<{rEr-n1n`XPjgvlWm-nuXmcMgDa$-5-TMHo^ z4$rcWle!pTW9_Q6boW}WM)y`ovOLcS5HH4mGb{Ne zeeXv{@L*nJ+1T%jpXa;ZPdF84F!R@!VDVbGvh)=S%%rXz7q|hu3^KZo(uTP0Rsi4j zDAv)x=2zQZ&k9j!)s0SHXCQWc6QWY*Dg-F|)gW_}fiS6%(FMmc@D6vd5bbx%wejIb zkMa3(nW(r{B#ljp3xFvDB73j{j1P^Cgy3&Ftm_Klnt!%kG9H949PW^@5);Bgr+np* z8<_24`8D@(X8YgzA9guJFobk%I~upRd7%7NOX}G%R5yC*L4jhYtdYfPX71lG3s846bdFq&uc2j(;!by0Ktf&d61Lh@D}+T#F8B!YXaR>$I;6`Bjw!c$ zSuS6_&X1ZP08U8t3c0$-3)MVLU%gBySR)K?WgqEKzL8?rWmG%gD{bQ`2O`54bEro4 z%PGmN@cbYStY85l&4wT7pjpDnM(bbyu%;g=U94tKjJiur_}41+W+(HI1d!V5%7d3I z4c3l`f%7_?6nCwXLwL)&>;oFWPUIF;FPF(KZl|(#VhZCnO|RwiQlRGgTW08STmWHg znHTK;rqT9ylj^P$I=P-q#vc~$V$s}39!)rF!?FZ5LE5Z?)LR_F3J~2htC72e+(_kS z)dH5gc6B?hMwLMM3Ey03}PdjSeAsqLIqs=EKe6q$9O+{BLn+a%*bSkasW zbD}8;%=eN?$`2dU7jQ9N%DFndALnwkhULHfwqJ@x21gg@xc;-xVsIL-HGL<7a9H=U z#*9%h83zab5ucZJejRhQG6CjYP7AhC+xc{Yy@_qJl@zP?SbaM9g_KvGH7iMKBk2>@ z!K+Zsp7zZou|8ZSj1e3vA>kC!+O-y4OBy*U$*n6p?6sX+&O+2&^w_H+f8rF0ccTsv}fJ zR>&#UHV{B_N=W#crM$UNFz;&<-ru2irg7-O9)JYiW)fkv-*VcmNx3(xL4*Daq#Cc! zI_qhXVF2)?57y!O$XDVCrK7prWC4{;j!&n*!g};ef=50e!Wiu!X%I#OKrocqp=!0d z;JPEV05zM+G9&JXjcb7{*<8EdC;#=Y`)hGdIne;f6RryoO^Yx~!6|F-9A!>;#h>qN zo^$I&-)~~q8dNB_oSJy_FQ!>LjGfhsNVSHdTWC{m=n<=LaF{(Uhx0jv$%~c6jY*kEtQMamU2yGO-TL!D(Z<3WItpBJeD z;($uOyR7~Fk`-#00;V>5S_m(72;Yfhq8w5aqI~oh+v}{p`nuff88h)Z z^6WCq?+q`YiImj>OT`a;3`ZBLf2%70k?r=eqYcQv{{iL!|MEzEYL|4B!AnatGJwcd zJz;>kB@BV!M$oRZSB$`!jPtp}9VAv@!zejYq^)y;KH?0<@~;^KQ5OMeU28GGtiplH z9Xz+bY_h_1)B%1EA^LD>U0mu6FTe79mO<(9=#{p84?yjhs+thv;X!;j5z&LeXq4NZ z8r^9a3416C{aB1Q3@$gh=;20K%@!7dPM!Wa!-SLyt020M(K+!7oH)KqBVec94+8A^ zc1V5a1YLwQLHv0OU={pBel52oIfgyT2#m3|3>Z5m@<|s`c(x!4g>eVs_{W@rF{9Xe zSpBC8Y(xqH5R%e|4RQZR|duPGp3YK*kOza412U_#1W z=G@o93Sv`&PDc2BYcyX!KIJC-d?o zjOmCmScE{E7-gBAhnZ8IQ+A?anZrt1J}IbrkPe-4$q0qphwH$H3T1A!B^V`B< zsia`2wCxfQ^vj=3>6Het6%-5iN*sbDckH#g+ADZ%cF!0tpfu|0867R~6d%1zfwe-tbp>T{FfyVC^= z6YbTWl!6N(rdp`DOmEw4)-VS|+L`^B=cBNX{h{guvi=ZY0l24J|D%SQTyVf`%3XN% zG5%alK-FjMSO<0m%A11sK;**at9}d_-Gt0lswyil!NSSQ8qx5fG~uIHcSU%CBcp7^ zu#UD#_vCIhgn8{b0 zmwX}dw|d&=T?<%xYHWz(!*WM$(#1V_XWmn_kR&rBT8B+~vu9S8Y4?oA;=3SN!R9lW zzo7mc9aBZWy8?Ae4wI#H^^0B>tttWXg&Qwfg~_bOx00qDg3j}af}CkZF4w>Q{hd|K zM(22qq^2_=`Kd%7E4E8|{<@{+;d_i!*JdmEOd(K>lkpq{IWt4}i$0%yEgQfDu{%Q& z6bxjl#XGZ&NKkGJpEa+x{I*A!7o$Jxdm!``cx4QpM8(+N0NDt!G_xiiHxts`m+s)g zLdmv-?de5=7y$xx@**wn2ZV1tOVDB9_AgLTqbP6|e4qBzL|&bfYpyuTKpQw148_su$Kz8dxD=Xcf^P z!&yZ1QuWPd!maFI%c`Fx$4F?lY#qcJV*%Rf_+WaGoGvbkU(9)MUF5Ffe+2H8G&G`O zhSSEU;s0M)VqPnw$luucv*yt%ozV~%ts3nCPzkW*v2EHspOX^WKp+fAO-bHxqj1o% zEc{Prd#9eDnZ3NZt}HJHh(!2NX~ z_ExpGpZYaCb-e>^bHdS4PPEuPLut<<`CK0}O9ae*jtA%?%KfDRlmZP8{S|kf{7csO z$(+iER6zI#_Z8M6gM#~1_%eC${q_p>NLN0eFP@d!YBz7CQexm(o*(2y_0(97 z2Y4N4Q_^B3^6b2cib>QSXI0q%KAX19ap>}i&`H*Sg-AJ9|C$4ged>B8g!%G~`U zmqp>&3|3@ju!()}9{<)hpB81HeBCr_!qJan5$Yfyp5|SfW_naW@p}JXiX=1wXyJmb z=6+Tg!Dtd5j4M2{{N9p!c#F~}&6rK3;LGwxrFhjgU^TX8!wf5|_dP&AjiwXsaTLtO z#56Arie*HZJ&o5g88f9?V@|+W=%0*jIG|Bud*< zW54D5LI6BNO+1q4pgA6Lzsoru`)A_TH8R1a&pj=r0~tBk zbNO#xDr)?%4qg{M0!(RxvJMy+5=)aI?d1Ysx#kq@51STP6*G+NK^QuHWMD~A$ z&Y`%%`3_M1R^c`P0}Fah2q}Uava?Srbfx$JqhNTv$S5J5FhF^Ccy3XFBMxLnf4O(L zJW8>GGvwowFw+J<>C6_$NHUZEFRYCx$~&Y`0BoXEk{Qw5i?1bN5|O~kF$6-5!|Joh z{Og)$^nNQ8uKQ=w2;ej6EB5LD5g@ttU>mr=<>4fq3 z#vY8qWB*WNqjobeY?q_UI^S``e0-n3rd^-MRP3tn0L2nUsH$k=B(E&V#Xu~`>WXpT zlPBXSLJSuByORd7(&$ki0}1<=CD-+s?r|Bwem|N94rkb2%W0{pRR{YPSMZSmM@SgK z0CeQ)H8+Ia0G7^bFs`u12R|m#=4o@8VHG)#;B-h|@@!@^*nee!#Wxe>Va}97m-IrxvHR7Ri&g;IGcDQ3a?f z{fo$?5YG2oQR?5s-uQRq2Q}Tfv39KrOmX9*-~g{f12S*1$E6QTXEzvApy5k0Tn3&> z_a|&3MUmJ-R~rD_6S!bli2entVFQl&hHA(t!+;|vBI6(6qFmM=ki_3LJADHCTF`TY zb(@@fUh9;S zxn!^XJZtv8@B6xb*YrLn>b%cI>z4(Sm&T)OoXYJJfwoaU{P;>jeUW01PMN8lIO%gs${H=})KFft? z;zk{&Bvgwf!dWVzD6cOy@VeQ@r5lPVFBJ|6X8R_X{LqJTN`Zj?b(IHk0jkziRnHzy zGYG^eGcV=MQfj7k;ZdJ8)DBm95ub%I&OpLBT-=ag_wB*cBG8EMY+a&lCC@;J4p6o& z4{^}vG?PQE`UP}ehICUJ$q%jS<%##oW!h9h!a`!tXN>D)z-nlz-j>w!Jt17eTCEY9 z3l&!C6`*KxNW0j1+|@N}^emM{Q@XTT#bVEn^$VM>5M9@ZZ7py+E6qb;bGm;*M|rLJ zDrsgz0Ta}R4k90XW-p9Y?3!~d{1BhtGT1GegU&C)<93hmL=7@3zC&3{v>`YmA*2Cn zrZ^n*?4wB8-03be*Ab<~T8~_#HJo295K`|K#0jB?q^_3=(Pt?nOK%`Ux~qIJ;o_hf zUD^5+RML+5WUCwn9dRSH3BgRIhb}g$&aE*=9B84Z#^ROlXly)ZI=+U%bArd+M^izn zCv1w3fD_!>9t&OR-OpAN?m61?V)=ni)n|6`F|mU>BzG z90{-4A2jI$32zF_Yw&ZaS&{`3(kvPGUSQYE(-cm8VXo|xGyvA&IyWYD3z{@}a+rD7(2Vpb*p-C*HvWwyDnbFf6^A}d4r zJMehFty~*OI2*mmO7Z3?K3gWt>DqXf3oyiWg2(^Ve6gO?%jf-PFwZP}v`yB&#>g$P zGLvBhnP@qBZ%bYQ@@N!0G8$_Y%8@0x;t*_Yiq-3Rxb)@9^!@FKjzLTO0cHeo(~UQM z0pNT_IejAhsSuK}_DI6`Urs(ma)O9Gh?^eWdT)F!G*w;VCYDEmg{(XT7|z3C>`h*v z;%?`M0A@ED*6TwKDBgH*RF%~IvTvb9jZpDQX&cDG$c2*9P(1CCeY;&7banax=3tP6 zk}e8mrY(PUD1xPxB9R~@PwvjunSLLrg(X)eS8ltFwKa2y+Qh)v%c0kw;|BZj4`3rF zw{TpMs-F2)I)Nkq-$LY54N*(SAtA@#oBkPC+oma_D-t=>s_K%SR^Xdi$ZL>rJ7; zvvCFmk7ae6;@~G27@cE9(uh`^Vif&}fsO7R{u%@{$(BI|Nx$!ZvUUrB>u&Xp8PVN0 z5iirsj^OP@4A%>shcrSN5iV)}gxrRJ@m6&~02iJXG71N?;GcXEZwG?-LExEvYC8y$ zI_csj1F;{=rpi$4$cYOuFL&KC?IZN%R+rekFJZdJlLzDmrlA{dUdY2xdyAu-@;q-PRE*t$= zF*O1iZCDN>v^3DJy766@HJ*)|NAC#%?aafl?ziDe`%kqntx&9?kT|lMCp1)aauo2Z zbJoB<6oycd^UPqL@5b~i-{OyAkZfK@6!!3=Bek?m2?&JX5%QUoPB41_$@Ql{8 zY(=Plzw}sq4kZ6o1Rn=b#V3#*y8`&RFP7&T?8-$hp}6TLDh2smtvl*#ULt^Bp?kGB zMG(4mvSMsVaMe+Wfpzx}O~{qap3efJeSkppI7OgYPY0s;Hz(eSzW1P@At>0X!dhPJR={g z8W+#-=4!?5hiW1=&2nbbt89`iN%d<^KADkAtO^Jg!rhFytm%8j95P`?&B$xc!B?V+0g5e zSvY~r9VWjXS~kAd1~J9A{%~U(3|Kp@pSD1321OZ9A1sf^@0oBbLKH67X zIAYL(C>U*SU+eKoFI|Yr!sy?+XHT0<^ zZTq~ijQhU;5JRu97xjK&z?*|<<+0*F%C}YM+kBsC9#UK8>ha;*7Wnbd7dwzc%4t&= z+lHX|YkWrH`F+ORG`J3F0OI#t58mr$i*YQi@Ivna@mDtbVWWoJ?jXc#uN&esMFK zlf!s!E)5HJWA=Wnp#N#~7~Hn=>aoGgWX9RxafhF%R(%lUUCdin{M0r2JBCpzH94_D zx~cDckE3p-o=>R;6bt-IRDsqPABo5`yI=B~v`z!i@)wd)K=SG{}XOG`@mVdR^Y)qedHBM<~zt>R$Nkc$kGi!pS|uFpBZ!0S<4msi^YoboGI3(krmo z;iRa|Fb$H`O!NGO!<3fr225g{dQ=c^(D_W^q|J_?W>hc%c|`_&njvJO_SM1I+*c`w zT&e6}{8i2_zA?E^{Rk{kGP7$B5=1_7Be}iR@p0ZCUj`^DTBCEy_Dg3;bXYkM>}5;T zOGB*i1BLAJZ`~Xpe}x3Z%um25iXeY~(OaKTBqVbL2OszuF!j4RZ)%4HUy~T##TvdM*&wjhYh2O{3ZzLgY1lzBy?!sk0%KK`CDKwt(Rk5!JjS(Hq@g(26U^S<;@H) z>0-If%zb(<3$pX?eVFFZ!=<39rY}wb#%5Wx$(12fSGG+um^x$C6uKYCnjTfl$Qu7+ z%tGIW;&QpG=w$EQ88J#xN253*;)7cw#r*~SN6gRZ=N#@m6#ioNog{+GhIi?)ET znZ8&x$7ojQImVgIn&u$mKOB@1x+^%+T#4`x`-(5XFn{)!pax?1A`IW@%-Z#TGjhUi z%O)Og{m}kxMTP!$$tL7D17rCKsU~RM+`>0uOt7^!7h|}Or0+wNYN~(UqO*~)FLjxQ zbJIZppYDahyMKy;jdv~g=I9-^&lKBf=`feUno~?bl3L^#8-I?95AM|^+LcJe@g7J& zcHQx620Z{7==uUVn7mvp^){iU*ib50k7MC9IO?FASB{e3F8cXbk;dCp9$)LwFsaB8 z!pv;6=1F3So(7toBOc^6PYjM@FXIgv>QNm^Cf;;I3@pFnpf_ZwS!{D5BzSc*pn~}0 zMyNbUtdUKxRVYD%o^)=(NgN9PJ^cyDG4zODnWl#;5(Ns^p zKm$&MU^l;)+est8?b$EqYnGdVU9mEoJ|37wOJpL)@-Ax`vCPI*zTJDgtTqa?12;b9 ziq(WiBu^JhL$f+t_jUAhZVuY?>A1Q#??M|-~77Fyf z$UX_j6$XO-WLQ7Pl+2aREO8kMTFDwG&NO@)nLlO1#XEj~!6dQae5$Vh^d{odWR(O| zi5ma8&8p;&!mj*RHVQVghenYuBv>1!G{gX`MUu zOv<%DJg!F6pEQj9pkpJt>ConUUaFWj(BRD^C|}%1Yj|JMM}f(=!@Tm@C>sq|E}XB! z^2 z7M8(8cK?L?@0jdxbbTY!2{?uYKYbo>>fp#f+Nh&mIRIFp!gs1=q4wr<4J3ziZ@n9J zDwE_&MK+?b3-#uVH_=l+b2U;ppG+YzV;YU&>Hwf5oPQo0$U{%wEI(mR)upBmQv z$Sl8+X?TmrF4|7Fi@EQe)NHXnPnca_iG0jQ?X&cFYnhZTsoS|fPj8&%seQiFOgn_G z;-VpFHX8ME8&{zp6&eItEf1_v$!A_e*iI+=XMO!mMpag~DLnsH<*+&7K6|jEJoCuh zWx&|uc2vj4GS8hJLoZ^w7Bi6z^}BoSXUbx3?nikK$5U{r9^?Of%2{Wq5t&@RK$#x$ zubYW{cf<6Ar6BLehD)Sv+Ss9Z+o)A{yTSZ;J88251iE72#-nlS zD#|wt_}xr_p_gNI`eKzI+Q%vIH!WXMcDUFX^s0~W_+FF$13Yl}y__VdrIMRxwfA3`0^T|qGGLVl(Q$F6e@8ukHr*vYM4APi=)P%l`rN6w&5Ah zZ~#?vHAE0U`yX>IjHRgHD7EF00WaSEg8ASwxSHY{FN?z8(p;fbEnk(=mf6mGO3Kba zd?_92^?Rf5RaWpcH!{DWVuK=uF8V>_S$%;9P;Ygy`SUQLrF6%^q^%new)d}*bACNI zVhLzk^-2=D?7*!U zt*D#C4xhSZ>D~y9+ow}|GRc$1@)lBf>1BFQ2Y2Ct?)6PEx)lN>qdf+h zIVM;rpurAgR;0|+N2zo~nS}1H#W+`_Rp;a@;9M7InFNdqd~XZmnzp|3ZA?>f)N8ccub*wJuZqZvs_qp;}ikKt!kBKLyaHtYa)Cop}!-dOq2V;<5Ue+N*=1hL?xhAvE z0NI(Ie<8@KREcl+W5exQfg1WA`2i5(*qt=4=y7`G$oRkaR`*?=;n%^b^nOxQYEuD) z+v?iOS`lk%rQerY6z9D$B!)>JUUO!l$%^&|IhFlQQP`T+A&P7Ts8bDgcuvV2WwUOy z%1VDMGx~=hxgY~RiLX)mXUN(IhKcNYT`6eiB+JKjrSc;V`)qBUz~^XyTJ@g+iJrxd zao5iBQlz%yy`p^=AADaq>kh@Nt*XC;x1{+H^3lo81s2xyobRpzwPIrQg%iHyyn*Q! zjEYzBUNlbg*i}j8A;+}O6%vB&bRFU?M-BFJ+aw#Dmw&jr?VL2< zNkbo4=CZkM9I#y6` z9c)H)CeeEX4P6BFk2Aga;7-M)1N?TJH>Zn9?RdO$Cr9U-!TfTG;|#LtR+Up(&8&`E z*(a4cXWuMz?N=}ASx@D-N`v@s?ymO64gsro2&yLbEIuK4`5;6_G_4eTg^msSPEerJ zw)$%9=)OJ#47=*+zz$OF!{>zi0VJYyRoZ9F-AC;Bhh2@o=`afQa1Q4)=Gl(U!^pwg zK209FmWq<&@&Vw$_SZ$0(a><^f4lafV<6pagbcTt1e7kPIn5G5(by)+ela;NV{a>2 z8{ZF0dEZgj!wD>K05kpv87PCvRPlCwLS%D=yuQPui`cxohR^05)DL)rmaj7#T6?gm zzU&V&=2W;8o#eQaZ&SYT8yYy&2ReQ}OlHCYPd;+YMrK~*S=bGT>&5!+i&{kp^~INv z3a)&|%4n2swMrw~#n_@EH2J~IqwXNTktw!|TZjssGpj5|(xn(MXRDjxtfv0?juab0 z4o_GcA+H)!1cfH zzG=j!<(&N1Jexz~?26R#=hvhxOMK*_E+4~E3BsKFbq`}sacYTi>Gx8v$8DMOO>sa`Ey)M1Lg) z-{&K-sUPorxwP(KShxj4-PNja!K?@5Jh2GhM=MVpN?Fz-HWRr^BOPb{Om-5OfHcWJ z3BePZ4GEgt_Dr^JIA-&Uk9*mMmRp+dkwdO6?4@M3sSzNw^UMGgqv7I_A9wi7T=(+r zC85WW;xrhu0N=hRY?O`jlc=kcRCIlwGd@`2<`cTursxGRm=vtwZd{eRBqWDccNotX zbPOoyt3J6kbDp!JCu(o z2Dh}g-(F%hVY{&YIc*r5tkLkI2i9b}5^yTYv!OPDQXP$Fuoj93f72VFjFJFGI3RN? zb56znT>mE@Lhw{z139;tEt7m069SDSM+J>!1Gc zIp1t()Hr?4oBO89m^_1HZG^{FT&`h_{_!S+AzdI8acFDwy zu)HE@fAm3V_O+J)-tj6)0 zmD-1r(Az85MfAQkvJ3)K@w$;V9nLX&M&d0biryAo;(kYS3+5xQ?+UXC2I?4WG3UeNQ!YWlxaHOw}7zp~ojN^in?ht*$&HLOH2wrkFQ zIjU3Ipe&USc%>*=MH{Gtq38i)(rHDwUji`ayOYaaoYl#g zg+X~D)*AKj{^t3BFxE-R8%+m`n67aK{_R(ct@=c)yXTABLU;JGFd-y-Up9S*oWZoA z!I>&KHYBi5$c~2|m~VVBnL4_+mDb)Y{{L9C_)WD&o3KI1v<0Irw4GIUEo0^3!wyqb zHruI19u0&T%iU-<{FSh5}|7OY&*ON6IC_RvhZ^6BM zKO0%y8*WcYB}YNe)r8<~v1wl`AB#%+(ryEZMx6_dKTAac6e=5BA0r;E36U9dwNlu8 zvyf2O(LYMpjgq*v^dGsrXb~LE>1AA_Z5YXmYv1|sbnBD&;9HhAmKHmg?@3yh)!hC1%Kqh4JNT) z;e~Hts=T{4l0btT#%`agd|$(W;`H0vJM=ICy}?~0U}Lw&mkhZBWQO9OoLUmTU$05; z>>i|)Ms82*62~?E1+7_bsMg(4lC1!xmu$PD8MWWlM?~G4DBzzhZ$#G(JzIW8bN06(FPX>Cu&Z=S56)42ssf9`3J(2|1f$$#M0~Em^8HHL&kXB z(tc#XJ2E0!6mzeTp;l|+8C*EEEFO#D0D}hLG5>U(w6>={0Zh1$k|0ITe_nT*z}t7W zOVt9@;K?_~iG(P+sMhBNx^eN%m_lDLONt%hhDN@Q&HiMw?&}JTh=%Nv|I0=aTs{)a z;$)vSi2$u!W=kgiE7O)32RPR^P_lE-qz3o-stDB<9Qnl@!A7XU9eQYb0~)IZgP(*w zw-e)`7^n*bV=1WQT7~>D_FVDk`l<(I`1`xp`5|6)Snffenw~%L?k!l2bi3<)6SZ}E zjZe$SdA>|aM@|nC--X4Acz?9n#gKp#l~sj$$&a1J#+rdvFASt^1?!;3G(3U~7rcT%w`ENk(Eojz6HO z;V{1|NjT9eIN~3cF058zSJ7rZC-w3nD#9}PpR4`-+`pjw=Iv*SOyo0Yjt(nv7BCS% z{q)W;{%%|uj{fRAL3APZXR{mXxVvFz!ld{UsygC zJ%$Tka^+AP6@wOHzn35rxn%Tq(Vg7QecLPxop);$Lj{oSgW7DAMoFjIQ1~AMnY_SQ-BbAI7=+RnB1)gZ~bsFCe@HAoqnuSd=zJwO;D{Og~{YQ zhdvs++5R7u4cxbs>@NVP$I;^G)2!!(95AuxK+I3TI9xf}pz+{M+!0MMTLP%yKn!O= zQ^}3vAM3)&A#C?Hb(%~WhNv#$&y2zCLJN^cE~Y-Pd<&kdmaBMqmrvDvXF`3)22i`N zo@%p35}D0&k(Us_44o|}A(D_^QH^`=Vgj7)Zb-A-BT~EU{%RE+OeXhv5HV3W?3eT| zV>Yn)&pt8PqtK8DRz7!U;SvD=H{NrhMP)6^?)C*{eUljqlpz4f8Q%C(xp4Y4+L3-cBS6nmwwWaoe;njBu0PR$jv}}Chm!p)Jrc3a_62aeu znMl~Ip^S}LoTOt?5UKud3*5=`HXO?ejMO&q$2)Cf{6@5Wwz>L#=9s}cQNIlPOZ zrlJycLTQjVhq7J|tkpS7NC+mwzeLeI5DYqQE^*NnEE%E0t&IiC10t>ex4eXD6L%?? z)a3%76tF-jt*pY+*oyFp@Bs1fNMx0!GadkVz6D8P zL1#*#Ox^jeg50IDi-Zy^AJt#?J6F`%8t;xUOp|&G1~4^dcx{bdo-`vYne_gRFwobt zE?h1#%Dqc##;X_;movF;?%55%jZ-(t2tW9~rz)&n$6ewbp@ZAi26m`AYI??|*;?xmj3#k?)xc8)J~*x?-UF=qy}zF)wx>1q%;j3f)jMXIWWkyb`kR&5l=D;PfsQFF!$S)NpZa z$7r^DNZ|Fe4y&OQ$iThjPDHhebxOfBc_=t;D3*XEyT4Vw@xHk#(C&O){%CQz6W8&$ z{{VomGh&ocA8`JdSuQn|r*%co9>vAq_{-X0`YbC@4U?a_(Cd7Lr}Q!xo0x(0%m`;% z@$p)=s6ATwAYh8|>dQ|CQk0soq9## z7ibFBu+P4AijR_zf{^eX5^&w$b%GT$N`k^>e}_fHPF zi6FXPN|@=IY9krq$pUY5vR|iVXSRIh9O{!KOoD$_Z?uwt?wC{l2_#JY#Ol2z^s|lZ zXPpWPof$B0+I-r$c-C_#JYxJX1j_*1O8lv%A`g^#b~cg0BJ1dFIRcK0N5AHKzR_i= z1pIHr=RDrykmQB)S{q$T4Uq9!a)b9$W)0>wKTo((0hy~AR1jMj7c9(e4*N*$7zg;{ zh0Y^5pHbaV|4gOtM%0Kmo##$V_NKVpedWjCyP;^xNCffbGCy$ltUU03GfxFpG|91; z97MZei$^MN`xdY)(=kd$zk|K8oNbnX;wRT;21i7Fn{PVK*g(-2BGZpvLivtQ9k)v4 zQD(NK?S~XK-gf|K?tz`o+VGQ)-CwYcU%0pI1Um>BV8h4wVt8zeO_RqF3uR4I5L4|Ss#s34bENW8211XkLmV~{(%GXbco4+wy z+grH6f(I97LXH zcQ;@SPsAiv+jY-C?_e0E5OIG@Q0Klz%DT08W^wTCXq?Zwjm%kBm-nsN2_A;Hy!7_NwQ3VtXwg0nAHr6YUXtbGcH!?B zJ_Kr28k<#v+gJB!T$xhh^*bJeqaf%LoEL}jnx~#$mzF&68?d%daNN3ZKTO{p9+^Fo z{UobkRuWQM2%=X2a}LXdVhJrg6gg%D1NVfz`G@a5T~6VLcH=iM`3Qqj{tb*NIH~oK z84kVH{yFmV3Ame7d5w9fub=w%cH5E#CUE#r9|}oX-oiiKURswYfg?u(75wPOD{Vre zTn8Wo=}AU?zCR((kcQ{7R%zRRmm>GTf@Iy2wl@}>1FsC{Ilyo}X_pEZvw*isy~=XU zJ=bs4$wm+VJNKP+oA|@}{>FEYjHjY$K!dLgMTi=k(}Gv0=k$X`mBLA4v};B4$f0=Y z-5iZGJnnad)Z!HMaRx8YN7EO4@ObU)k+_1yha7?@mbVG$+gQ7h+Zit#@U{m6`*i}1 zd>}J&Cl9}I?<8`ki8Ydy;L3L&ACa+8W0cue_cI-zjz%?1Bxd+Rr$4o`r-W_ABP2hN8EI*Rtf2(_t3{Pdb%RF$hkx_ zTtBVrQpeF^LRwnY|ctWT1c?$v(qh{TiPXqsT3;(3^P8m5oGz%o* zg8)tW9PMp=sXW_x*@#{oRxYjE@wrlfHco2!o`XYmd-cs@<4q6a!IyO|7ZFE?NGrt3 zz_yIEV+iFv)ywJluF6yck>4Nr1cZLo5bU~twx?QZ8JG5&e>aS?S)p|4@Y#N~HyKm0%RWi1zGaj?=t9b@pmw$L4h>L|`$O1~rMCppJc zf0KM191_Ll&W<$ZJg+j#dJU=gWAO2-9M147t$V5mh@owqFYTdfuv?q~6PZ)0?wB}o z#FsUTJjY7Qo)@juzwTM|+_3(BKc^>tx>npJfNNa#-Uo5Jp=BDr(VFCDJvluA^WQ(7 z6LRq-&evqShHW)_O`pL9!StE1>B74XHvK&y1qq)m>6$ARW!R(k zGq~>rQvS|~9lfW2)0TgY`-k&>05V`74TVHFb=*b&@OiA_>on1-N~$v^XwZE(j+x_; z_T-6SY{m)9vbesssGJGg!53kzr0bc!w|i&%&t$muFQUIGHsGjtNKZcw*dY=G!)B*n zMCwNuV*PJB;re`fhye>NCx*kUUeC2XA8FYKSo#+w!eW&!K~7Md?v_&~KJjZN-3f$O z#5E@Hib*#l_Enne{Wb8l2*gZVRFT<#-K>+^Pd4qS(ek%)6m#%FEDK#Yh^+huKf&*M zC5|F1RCgKa(G6QGw8VmgV}|4Y?<#u~(R6xU@Kx%*SCBJeNvGf91?~NNzS6S8t$xQ< z3*+Y15KceW^(wJ+2v&ECw-ka{tUZ4NpdNana3C&gU?nd$^wSMX00H*9bXbkbjZX5q zI(8&IGkTZhUF154xc`65*Xu_5H?~XwP=5fYyt`K)&Klly`K7`;Z>IIU%a|EHZ9to- zZ>tRTq7b@JyjLaV$sI%vnigi@S^VWSgk)UyGC_=yT9Ch|JYT)(g5{2$M%F@IL_D6H zC>|szh!JJhsA9rwW`&>JlANIDPBxVwXE0NNzj9O{X{s4o2I`H^ z?q)->43#mCns(XylPqB$cPDH6(?iAI^yc>(Cwt`^A22_831nelT=aLGTN2@4gnml=&o7<8U9b* z%7t@i`VFl7QhUTALa6yW<|f)jWKVZq_4j?!VK*}wuDnsf9s!LTVCwvFedI@b`b&-m zmF2SjX*MnYp1QfK!SglJ9OqpcY|K$?327FotPIhdy%cpeC!;D1vEQbYP=zi%1l|4z zfa;h1&wqk^8n}sO3948RUlaHrWuQ371rb#XccAG|9NWE<>H6u?E!C00O?SJj)=pb; zb?vvwwyDx7D1OJd7JZOwCIu~>UHMh`+-gA;48j|+c(Ng+JyCC9%7$iPY!b7-<&>eK z^n1b*Yp3oyfbE9B$0LmNN3GY&(_KC{`JRyk%MLv7*K5KO?+kcO&j@&O?76*V2aS}7oG_ra^}mB>Ft%*5c|cuk%(ad3k|-ils0{^wj13ii zT>e}Oh+qe%%$oup%<2U0qx*xMGC@u$7ZNcr09Hd?)79_7_uuq8QO{mto|(T2`_al+ zRX+C!E`9IugJuX~Ts<_9Odn5~T1+w(fr(NG`!jHoY_fw^5naz6FPA6MpSmb;Ph zzC7obzx=(?cVucV^uGV{N>A=5P{8&N52s;a;N+eQ&aQlmzkTbU3>^6)xG6MK%ufvZ z)n5i`g=Zu`t}RFstpeAmjn1rx!JgJCu<$=m+$=jeANKXq@z7DD%xJz~jr(-i-#Dwc zl2%qGVtQw~fcFLKW=Vg){dQMidO>}%Ahn~|9MK6@8Vnbz`FA_Y2C8D=s1?5j9;ikW zKMdiJ_D6I8V!^6b+|*yRm1BUmJMb64=f%GS-g5E_yrQE1p~QrUbFE`>s&6m>V(V8m zJDl{mmk0G^sr$(aY=@n$sUv31z5Nvu0q5nn$WD2Sm4sUqp4~)Oq<_;k9j4z`PN9OW zws*MPA+7rDRH8OYeX+XG9BKTGUw2dHGKFNZ!!s|teD1k&LU7L^zg-%hi?&rK7CI>Z zb%Mn#+lLrZ22LyM=GNKprgavG$+W`&0ge;5hIFT0S5oo{e$#Q_BlelEh(_px`yh11 z%<0Htw4nTU$MiPdpy1kv8=TZKW0mchzSKj;BwzW~I1-;=S1X^i1!aFYQBWhmdP5HN zC^s~2u(nR57qDQFs$ZT}?7UE*YSpxU635-Ga;z-yPcM~E>!pcx4RLucpaVTaz1zsFo*9&^!}$EKU>Q~pVcM>AiAB-*7DJR{=FCD{}dNs`h@SF zS`i6*viE(@?$_ecGsqItyf)=m(OIDeN?FfRYqYi@>M_Zz6z6@?9adb+5VHVr>d|c< ztV7>vochl~nJ*u}K_<8912BiiFOk^E&qqcKn*Tn8H{S#C)X2bffJiy~sQ}G3acu;& zmcyS)(2ie@qSgo;e`gc$r{6PZ^F4ndb{510Z@A>y|Hx-Of;*ApTu)Xs;2o+Onmox5 z>}Z!g1;XXuoBk=4xms5(HHcg$W~LF674B%gl_f`$4_ZYR8^DsNog6a zYTi*CK&DTq86cv`I^y$z{Y%XoK}=B>&(A2la`_wW_UF?0o%+}QtVN!lQ1R$obPVR1 zwHt18V0w{v-pjVUwtfzwv)Supy2=H| z)6F{4vd^x}pU78@86Iu}>8K0H%%T%53`9pIO$6Rud@;s$#X_-`9baBdnAh(HZ*%=` zTugtzzq{9)u7Fz`K_Nc{JD2*Gh|4;xdM`emJ{=H9ay31lzAP-DPkJ6r&)y`^y#YBq z?;*;iUlyB_*i^g0mN`Vjn{w9YgVlS|n_!okYX+R~ZYtVM$sHM^=j(j{p&#D-6oKM6 zNx+~hWA(ieAc?zI>k5c65RuzANdE-+F66}@(cO4LDJuTBx49PLVFy(Y5Be5ow#+>UE883t2Vp5BPC6A*%E68%$-@h1DVNs%$5fcHCKwEvWjYU)U;rr^j%>yc_m~0 zXy4IK+o{fP_jh2KslKHwdYeYxTjL&lOs&LV)I4wRX!lY}<70mZHNc~-bn~(Y&!D#_ zj>6z?TCHA3J+CDZLoc&cp%-sg$`D`Zy$4Q~tHFfUjgp`Rp5m}rkIGZ48P(hqK8-Ut zIZJr6JAzl^%t{O0bhTCc9*zdqiiUnoBK+hbAL}y4o5Yilgtg9&!|&gUMfM!V)KhINx}~Qpdec{O@bJHR-;a}hUp(HxZJ25MEr;@T{aWj@ zGd)*$S125Yk4>n|Brb-FLZNOm_NbZ3nSD*Rh^|7-HLp(V#8gOHq^$~lW5&v3A+bOB_D_rr{ID5?q z|JRuh1_PE>FL3gD`s-ev6Mnxxs_`+F>rX6smac_Os3504H`QqaakhK;PV*=6PGeeR zQtH7Cg1z*QwQRj!Hzb0_IL&Y?KX8bi)!HWN`s-+%8FYp>&ovG-mQVUejW${V(`?AX zmf`Iv?|Qb=K3np+7Udm^kMr>!cYSm&C?-B;sP9`5Gvs!(HHl%$vQs{fH{N?H`(~T9 zUel7|8?51LPn1e(viQ3GfV;NwX6*e}B!H7?fJ3D)PPI(|FU;zk!gD3hN~hRZd6iK| zPKUL9d**FUW&g(`AlmMri+ZWv(_f6;3^In|hW@2W<0s$q7M(F|U6mW((|k2JN11Fg z$A9?utEp992q*6-QEm(MPXalaahhm|!)RhIF&W;Rd+Gop(BXFJ1SJ7(hFfs6kS$6 zw`ROIlQiVCZ_}8tqu1u+59X?D?v89s6{V2>sw|72{An%F(D76Euk~>WDI*Etkn>TR zmIq%1UkeMS>+9fC@$co%h?*_uEW9D1eSa`IuZ1DT1a2#*621(MIdCx_q2UGePrGc* zYkhXZetrSrnT%`FtqxN%&`*-3Z|Gc;BNBG|64>4^j5DKFHpH*ObB_1#uzWz?;=|Xb z;Yajqmf#=<2oy}ep`I!;PvuoqvTjjQ3xL}J(CHd|6cWK-~sN?6RHEW#eyq_{ZARP0jw1vGkk1Jz<+oqPUPqa2sZKK0cLY8>$CWzI+2U1I~hi+^5_55FLgZ#7MV z=`Ows?z!a|Z9C zFCV_33E)0$Z?O?^_{(-f6wcf~cB$^jdF&%9Dm+ASo7gk7x8;foLw)JDHAHu z(mk&CXwI+mC%g&`9N|E;AUK{@t6)l+Fma?sjys!tq2{?bs7;ipcb1Tgb_EHKjpE~6 zd{y7t)3o~9TPGsLB@x2+K3wFNH{Uth%E@SdVMvsp2&<$4JKDfai#I=Bm%*;|?pTm6 z7|BZ%`j(Sl^g{Q=-UREabC0wI={ecEE~!U%Pusg~oF?Bo+Yf1}xAvFVB;2()_Y7!l6IBg(8J- zXBb6eJTfdJjjOlHtAu!F4tXY0n{Uz?>_?;}r#9d7M*EQ{?$_~yPM-V&o~O$@!#Xy5 zja9Qx8fO`NqGFRbTp;vxr#LgUCtXEFaM#2Psqd|`J0cM)#P61U&oJ+ZbhMXc#GYF? zue&-FQtOFY*G_IlMil`?w-`HlRJM$y$>-(DBhieSzwwrVz4tYw_;RbzFUYPe>BXUOY!|Ppz($9PcFfb=tD4)3 z{0@vN!Zo?pPC(C_0>kBU<0dQ$wztf5Bp5x1oz zk2ri0%Sm6?3kT)q%lYx6`P%AEM3E~5XQbJ8>rcNtBD-*PmQcju=@nJ|ebMhh?)dVJ z57v{;qZE2LrG09=8QCOD4U1w5J~NxyqXKxe-uc?6-H=5yxJXt7goemXJ+e!p)CpUSEK-ND93w`6$$8V70iDRc{Rmz_N1WR~_D8RfbfAqm#KI5VxIV#-cH=TXiEx+$tq9TMhq>RK>G3c?3`cOj^7z%7$ z2XQ~FzeYu>f*Q0PSc>))Ep66k!ejfWEc z9G}dbMA47c&X(!tFVRo%bv0FqSd2S`E+Ir*T^>3GkAkjm<5;rMxAhyWX@%w}rNI=F zj!nuK{CBUmi-h0)y+YE1p8Ql?)>negQGXZc0+dQbaO*K3+b&|~{%THmZ6QQgYe#QP z+K%(p8_kwfx>Aqcw*gi~JSH6(qWAU{z;3A|d9OXMQdKJVwO0sG{XZ;SbyQT{*CwS) z2Bbld20?}rrAxX)=^9G9lx`#hrH5{i?v#*@kw#idx{=QB`2N0s?z+Qb-FxOT%yahM zPk3K{`<}}V58p%vdz_lrET*AZ_=k0jn0`8GwA;b|R`n3RIMhW;nD37ZJ?v%fb_Z^> zgNQ>UHS9}fsSr|V-<2y$8sS_cmk)>Fk(cRI))b}VM;NJbp5357pX#jzpW3?>0!Tuj z9)T{w*5qxZrcrZ*sQWa3%c0xP93l$jgqI z$^k*TbtGtH%xKAUapnstd2zLcvs4^z+Fm~^Q{QS%qd}b{UkAsj_himIpM#`z5IWwx zpj4hNxr#}f3@PKfBJX3p{E_pOFdGZX)%&sT4n>%9g5>rd(zmib`D;2@0vB*BOuR{I z=r`Sm7)2#u*V)b^cb{*V@_%6dLKiqf&m)b2k=opx3d;K*Za8HEk91SFZ5-4m|N=Ed(vP}ciH7sGC7skd_iUm%0CEx2w*^gxlk1R zBQ_U~FSiVt;XoIv?Y^l zf5Bt&K`yc!r*wSTHFqSdVK;HT<@kX(tK&pYDziqL)=Gx8G5as(JEUF(y zc?b-ngbM1WUqXD36e*h}#n?=LV`K(=! z`wJLTRVf8Yt`iSfNQ)gzRyUxM=y}OvHfw~u@IK})O1zQahq)J1Qqn4~C{?9d`zu9s z@m=kwYav^QyqQ-&aU8Ih;Gn9_(2VO`WI|5dX;x?aMG#byX%k6k3q!>#YQ`uP1$+fvMaoy3} z-(^o}aAQB9W&d)dC~D)mxIZ0if2%h}_hrH3wNu}Tw4oe%DUwM9xl+sOOcJz)zU9P$ zDOY*;dT0;xJ1N16)w+Pv6#~yo*p0z2;T!2VdlFXuV=+b;%22V|*V0=`=^j3OTO_Ks z7CuUoswCkz&7WCqBV1b|6Gnm}SvImlKYW#(?D&RTborp(vT&YwAY*JuL7#xNz8`xu zLeKH`7i*hJ;8BmDDD^EcyxB%hYGP+jX>uEi^GFZwjWx``vIBKCAH1qxs`abE)wJ*e z?}!xs@yJmoAZj%*?5AirKIiGR0P+zK7tYF3}eu^dclyBaPsuURw!E?U&6Qw?m;C!jsujW+yurk8bX^ z6-dy4)JkY`iH7!S^;M#JJH6+zEy);0#ocZHG4v0n0Q7o%x|(hTh^=VqEr7ZnHL5xvY?Bk;6H*|TQq4T#$&+kdQaL~Eq;HD!+M=~aYO~e6P zNw)}CH@Kbt$Wu||nqfUW`9?fZsO=Px{>LzJhhfwp;b&&Vk;>Ee!+&)w4$~RozFL+U zcVS8Q8?SE*mk@0^Z5T{GXeU#%JN&ezzx_ruUU{~|*Axg-pt(}I!w8LoOB3f{NS?o{ z@PphnCK(U$eAU9P#k>BZE)i!OdHAq{6GaG+2&fs=bgnlJsEc9@)T;Bpsvuv_6>#YK^ceA@Z-t0{@o;TD;=(VK zaij{!G=2(R-qHBYLb8_DVgiENyt~9lPCah+X?+$yx1m7i=HEVsiX5{-gevlAvl<7m7hV&WNalV8Z{Ccv|tisg*JIJvT?!SEyo8^Oyi zD~%_kR@G^+HC7;P-L*=ZYi1O`HJfl&P&oB{Oys)z@YXo!;K?I@X^0-WVcYE?lY2)_ zQxU51WlMNHD`TO4>vv1@Cj+c~Ne;Z#HB}@?W2*ee&U>L|e}B*#d>$QWfpurmZ0tk> zr_2tl5Y9WT-ybhuW=tlI|9au^4sn`TIPc8IO~d~FnNA0;>@=Z?W}XI|yz4$1g4f}5 zQ(x1Ii1%{RG>4B>EwH7Lk<0XqF}P2JcI}-RCH=O8fG)@C=f*mb>&dW&6;q`?Wd6wJ zs}OBz+5pB!&4(z~a?)`4&3jVm?*X|gwAlrVODI3vC5Rpzul1Mw++bT~H+zv!uG2o{ zq^oICjpZ=lH#BuoPaAUC60mVnz785)zH&gp?dT`s?BaTDT?$dmSTC7*5hZCvd`5g4 z8)t+N+GMm`-Et$AFRxu4ks?TXy`2L5YBc-?hm55$@sdBX)(@6GK!%L{42E$_5K&p# zGdP1$7f58qtoOyN=$~^}EBR%Rhx^fx!a&<0TPE<9Js7|1QGc(4%8^?dGMO+!b>6%P zqNsge@*n;$S!IRKi5-4QbkWZp{@qq)^^(9(ZMp9PY2udjX zLy!FB%}}x&_y$}f&-dSkPP9^%D5;A*Wkc*m<*qLC(;|0VHXqv2Qz8qx{^5AaC$X@^ zUGJ+A3YD8?};MMu5t7nhl1vdcGCJGRV$ zDDKXk#s}hWwC(Vp#%+2C%W}C7Oei7q0N0G%Cms!F>S9hFdLv_zm~L?ER=$>F9mi8q z*}w3ZsdpcfKS)N_URr5~r$0hc|iEBV%OO zRX=r{sia14rApFD-Rpd5bbKLJvGKKv?_MdDd$PG+DM3wHT+|+iZ@88cUNtw$6)0l^ z<#{|fZOng-{wY##klG+hHHN&cRppr(t)S2oVKm@hSInc4fx=G=U3o9VjLwpqvrsOf zc|_z7ZQH2U)by@W=zICe4$m+?mnrO$!n7{vNR+cd#qDhxO1IHF?Iq1b6o~Ns0W`+$_bx7 ziniA8B6(y+;rl;}6Tky5;=p=4XNi`fftClY6F8gHWlQZaqXtu5~4)t z+KNL3QIyo&m}D;?LbJ3W7m!NlSUVm!LW zH7~5Bcbv4F!K8kBhie<*{#JGx2R{pdG>IQLov!;gEGXyP-MR*IlWt6pFMNBSdfV>i zd7;zTcyAO#rgPR z2oz|f69TWB>sfwAnbfNuUnr$Lt5(o2C?KaIO8+`EDjy+AfKZ)IOiQWQ{qrM%D#jv| zdqnZk%KS0T_8V11>*n3srZm7iUQ4ELj~5UKZ$i<>^lA2*Qtn(IG#B=GZS8)Ygtoem zQn?1&=MdNK?yv49TXsm$T0P=W^e^b>L}U3fhV{v&(xXGtwB;0SJny%tZ~$+KjS3A7 zqIiz@RZa2v>Es-mNeY~*b7c8_(<1$K_wGX@J$G5eDB`(zBRPB}nW5b3-)z=vFLdHO zY({LHa`fb^OEm2SO=mmd$B!sY-?&daq&0cdM0-hK^RrpJ9v zGS0L#EkzD9$Q88ZU!543RrZYk{MlaSlT7B;5WD10Sad$0>l?_-X;($hW`!CqtT{k= zYSc;ZC!(-PeNUsLddf3M+FmIlp|!cSm($ZXKI-z@g&B;F;!eE${A$A5Aad@Qcq8j; zdQg#zp`I>9t<-zj)fWFUP7tn;b}2oI!=pGu&W@l#vbh#UNB(ko1AnTR zoc*z-A^tYoAE^iqHN!JR-tW`>~*5?SXqRi7r&*;)nk9I|; z&x0Iy#$NoAk{knM~e`(zKqVR!ezNLvGo-_#LrOCi96+jfnFO&W6q|)5AIGfP@5QUUv8N zq`+n*Rlw#-{CjWHFI8faid!9ZY@SlXwqI{plS^+alC&}IQ3d|&v+b;WF}xB0HXEd z$+WI74%*RT5>I5hf?}Qpsdis9`v*b zk{17ER73!K^ymzLO*+^xqLkeg6r88fSTw?ySKmo)W1u5ZZ9r%ZXFmG=IQye!9{)X9 z7)kCbPh_2#;Kj|nlkum%{@)#UG=iU&+N9tpq?>h0&4AwC)}F1-U3NL4flcalJD}cC z_Ce@MMN3%UX~}4M49s77WVsIPck}(}C7{CkfvO!*+{otc4TqPO+__08yvbKhGtO#L zMg99Xw(S2N=@ls@(n=cWl4~%uvHyKVMfZOBW*k!a0mAvGPDv<*MSM0UK%E;{a7;^K z5nLzcA%#Zf(w6M3bX$lDMVEu9aw-G;1@#P+Zp^bY$G5@gu=-B^kg9&6tNjNm7?}N% zLL0(4LLx+c^0Nfl26G1l+1f0s#FYgt(=WO+lgJNS$x=}^gYkSMlTq+#7(_%>~zr~)w)dZkz66?Kr^z#ZkjY6cC62ijzL?!`nkBwgX!#|<~ z=clj?ayRTz)84*xX$7G2Rbgd`!FJ=7%MGk0#mQY&;7>)z9#$_C$8lc1^YMF}M$EsP z*4ao!v2a%yJjay4B(HW_k`0Mxz5kQKVv$M!hPssYrR8D3$)uRdK=zo~+11Uu1oVK3 z5_ea+F)`8ktvp-jknxrfUTkW_V+!>{p zr%W6jBamvN2FsC(GMt5RD8t8v&orC(W2*hJjzC#prM<0SY0ha5TISjd+K4F<&*&?oaDW=~yC z<{#h)h=#uiH0UC*K*K+ARizv<85v>9n;_LweU^+eD)ic3`hhhy#y_y;nAjDV9UfFS zJAC|XaNTa&AshNOl~}~hLhhs4j9O^7!6+|@Ur0vaH89y)oH+HmweZ3o=iCsPIC7s- zyRA~Rm5ZbC+x`^`P~-jPYaau>`ogU6Rjx%R6|UPF#B#-6l035?ex~A5vt{1~Gs}-XfqjYSfGu_#B)TOe`9Rv8}`IDx#>JDNDpU>tDhZx`Q zjK8qbXI1()+d~J+`cVJcDz!k?G#Nv1f^EK zCpJGQ%$f`FI!gPDcyY*r(Q!pDW)eRHMH{$Q)O-#^eRJT(n7(J<^;y z%a1%bj>`+x)6Bp08=WY>%k({OmVH$G$R`*X`e7`x{JpN~=Q}HYWGg6xxYe*CX?6kW z$^50#78DH?CVa21W-__PHKj4i%|^4!QTxg4WuBe*6s4-#l~ZV6R~GYPBwrWp8{soD zn^biW7~iwx8B9I-GvzsFW_RdOAKno2F||Rv#@0%_&T5W2cvem`#44zlF|I$~YV{Z` z&zaxZiUi?}++!W~sJ$>cP!Znl}3m+GGeSNX@WTMDN{%$d51wI=v`TGD>QyrDixA?g|akRgPZZ%2l!OwGOMf{ zcsL)%l!IBvktAS;fxz~*bf1axY5Li}AMkGyf1-jL!lR!{OnI^Ey0?CJT;D*Fhe4)K zlLNy2cM6s>9eciE#M2=Rj>nf=b2>W?xWh(PAW^PJYce$iPYZFze|RiLiL zkGxdGc`tKpS^nRO%-8+uzN&K@8p_27{~^c z*D({uRTq;v7Dz7|t$j7K;v)8Aruh(^0OjY1oVtIvM?1gR4$`)_8-ruU(64|1)8VK2 z#?S~+mwdXeo%M3Cs*=kI9c-qROm*zxRHb$`82tA?P%UU^aBf-Z@$z#m>#L&g$&AjG zU5fBq-7YkR#X^n*_82lS%mwZhQ|t?(uWNsS(ldc|S?4&eHiCSe&j2*%L^ zEbuK8g(sqYTP7rQQ5=86zZdW*a!|kY&UW_Mte{SN%=>mRmwL#2NdDFJ-h_Zt`K_(5 zN51J5efweN67m!>He?qi&ppKF;k|+X~iG_3}M_4kd?! z(V~HHMI@?mB0>hmUhalN(fuNp zD!n~p{OsVbd`Y2)*IEubL)Fx_w4Sym(mG#|d}mH5X-w`W1Q^@B;_ar_IhD1Hr2&2$ z|F62#KL^EO#7ZWvWu&OaZo8IDneMR;K=d9?k-hMMk^PSww{Ge%Dums_Lky~yU1Alx z%jwL(^an47a>FNi{z{FHRaVoj%=b?s+E0*JsZQ@6d;265Dk8g4(ODL7po8)gH+kTj zumVv=>sAwZ6QE*ExKn(^rs<9kN5z);rT^8lueEiNW4^lVVj|VqJ)~)uL`fa>&EZ69 zb$dI<7Piz2+1Kk|+3rCN9>N(7%ue)=3$?MayJ$Z#xmC30h%jd04i?`J(x92w+1>Ix z{IFMGN#Y^qeL?LKL(G2v$Fou9&mU&<8yW}=n!mBpGAU>o>+ma)ru`L-NMEaZq7vsI zp)#mA5F`dCRqs`Vuc|~;Hca>cCdfdLzvi*PVv*`KE*dax7ghE|`eqb6PtI$#K=4Ny{6XPHx#My4KpJ#I7)B&t930uP`T!Y zKwjkLUJ^6BU#PME)t(-F2oo*%pF(MFYJ}>L$3+d*6wza(ZyPgtSF+f*1SwEvAaXmby0+{gFFDeanPBw-KEPdfUJFK(HE zpPCr$?;Y0{P66=u*vpa6eeYhSztY0AK&Ib6sd2dc7z?Q^5_S$N-jhv4ajpCE5#|bP z;({ebgXE7vCqDnb|0#s!uYOO|jMs8rNKU@vZ~l@SwU-i6(%lg#iFG0 zLOAG74W0DDS5>~C)I$6wK4T}0U{qg_-zy_{)s6DWtJ3t03Mp|tR72-j zXDg%Nn;qLJWK#Qfy}8gj#E&~|c-AOreM`1D`idX?&R)hA`g9#k4p6_G=ooG;C}3h-uyu$o#LKhJm7*KKPf9o~Yj3 z8dnkuc#0Fz|1FE5;1dqv%{{jkk#TJ86>Vv>uw3Dcm*;3>Y>ed3H^)gj*f!b%g*NAa zy8Tt%G06TBBgv(##&3Bp`s*r}liEAn2dA_^+D~ST`PVx*p(j0pw1*^qrrHEa&L?_K zrIqz`LyAQqQl1fBkhbu*JT1@4URns>+eg!&B887og&iimNI~N&$qPAMPGPx6!vq`o zhvsMlaaKVMwWsIgJ#HGgCU}>24s8N5Yrp+9TqE{#mYldKl#2;?QAw}GpvFN%Vkg8x zLQpwMF&jZv#PxSA3nqzvY{`#kZQ(>s7M>AlPA8uQ(M97&sx*Ao5rhTs7qmCEi`pLw zzK60sx8~8jl}0!c_t5(139}$CU)?1w)5;*wrWIw-p;#c}q~=$F9e>B8px^#fNXMYo z=KBVH4@*|Zrtn$$Fo>GWb|1K1ZgN@3%JGB`qKK9CmEaiKCdhFM#j!e!eRxt=p;Mnf%{IdYYa|a~ue%LzT8;B3;(hYi6CCFk8@_Sq3@(6^hCfVFwpd-b?rL`CYX?6Nw zQW=>QAU+dYib#r0PL5n`m`#MJWWKS?8RG$KV-q}_sef!dy0?|~4QXkfr{KVAI#@4M zhK$?Hp4oKco$DE)Gw`#1H(>=Dmy;Pt`>or*!ClNX$=J~y7!A{j{f{bNZY7HReJOZG zDPW!NpSG$3I9tE?;Z`}Z7O{S0pp%^7#{hyk&+_-T65w)){n}mYjk{!CT34;2ttSPx@VoTC5ZNHbHk6NnazB`z`vY!N^Fv#>3IC zy;t)Xhc`pk+!enX;IE=f83UMwib!zAYK%q@i;RUtGGJ9k_jz zuWcz@XBj(S)yGSErb#YKaij@|f}6c$fTqPlA7;VoOKTVrB(+l}Zmm$v#O$p;97w05bmpk5_9~LDoWkL{XYzY2vbvhL2`?Bjn72NK z;QS39I%41qc82wXJ{;J3IuHwO>EahIwwl@S*d`>^NH2Kk?@XOm^mF`&4(0VNv@^S2 z0$=y8AzvRQ8WTC}FTzZUnQ&3zHCjeVmbps}D1)COivn_BUoi1e=_3g~=pWF6%rStF ze7=%s;UeZS*TXOUhN@Aq!Oxypb=S1{AyLmu=iz*TR+P>A`?Xs}`$RojkVz z%&_I);^t_UKDgS)?SQhrG z^$;ctCMtP{Gd_&M!@B`ScUQMd40n3jk*zzU5CRiw8d4q&Dc$Nfg2FINpYky;S)uZO zgmgqa*W*ETf5)#!R0~ECplx3b&y}$6+f@4ch+|HFOEl55&k~Eeii6ViWM)CAC`*6k zkss~G^y?wp?{!`dmo2&PyyJsfbZZowDcGD{)2CF4biqLldsGjPBp)eV809PFR%tK} z94qXk@E1eU23VRF=pr8x?43j#3LfMJ+*P{x($ImSuNT^c`NsAcEleAt;~ASt5B2my z%Yo40K8Qq1$vW zw%PLIS%a$|)-nU9NGFy@73^Dc>f7NlHvviP#R*<;6h^NTkOcVIGNLz(SKC6n0mq85 zZ}g2BKKu9gw4gTNxQg zD|lYr9#?Zir*%r7nbK8HZq;Y_;_hnh`BDF@$;?2&C*+x z`G$q(6=4$Wp$Ix>N`>eD}1n z@C{kIgl-6YTQ;O%@o7AwiYjv6tgf7IXNK?K{cT|7hI-YepJ!L<6m$9E9L@3TdUrXJ zsU$GgM6oSe7_!PKWR38QG8?;@lD=~jB|4ZADV58>>>(Z%W#Tl5TJy*AG=QL9zRju zi8^xx9Q}j2G12#bFMZn|#tXWV#e<5Bn{CT&753t_9P#$T?o3Qj;sQ2!%tOf-O8XHL zA|6`@d4a1HLQwHFO)RM8st99eF@jJt2AiRU#QO%{S~p&GaJ#qS&8{JWqIlczYrXYG zg%Ivz|FJVCZ}zJZHxs3|<4l@|%}iEH{9B&pDzl2E?LDH4B$y!D{Aeb)4dT!Jpb`ErjzNz14-hX%hlrKq;N zEMiq<e$``RbE_Cs0P5rZF+AYIr@IOQy zQQ#ofkH|kc`D1PK6xF7yiH}?{gET zVlHhp0*q3DNhwAQ269$(jYxmL>2b_U!RNaC%F$6gyJ<fnN&?~Zk(2{yCYU0er9 z&}FCdJ{F|F#i_E$urOT2H}xmiV2C^tKNu_ByX)NuUKFaO1mB5m>!;+3Uf2b|?nBK9 zbKM0vr9G-9r9mdY)|b3h9-!#Z*?m9C+!j_bi7*^LN_PM@1DtH1ljK(ZI?? z#V$1x`8F?v^-r9|55eKoV1Mw$>p7yT@1~rP_1UTaiBdhU*NoTmxMd4Vr^1dDSf$|X z4bH*Pb*_s>w&dPom|#I`PUdZn-vleSO&w~teQuY?gzxocia`IdyA3+_zqo!<1Oz85 zG}9JWO)Gwg0yHjysjNuwlPSIvOaF|tM*B*OtM$(ucOQa>%|PkLCMcK6>3EmHSKfP6 z_(%jz^EcmnIDaKCz5Rxyw*@PJqnzB_&n-?k-`rmVHPWUM7y50dNHhNz5ljsMbcmas zXS5+ud%2u~GSeRW&E(P7bVKa^%m963n5{mWjZDhyqG6Dv8=UpvW)}$4dI7aK?UQKu z9=7m3uLhV5Cq!Rl+Z4Ny^9_cei#1B`~$V*}jLjCWOE-%JzK+17ef1 zjj+qJdvRDYPR|Ol8(-8WHOE9Ptgn4sm>d2${%$KDDI4T-vszUc%+GUq;g^G|m!x4! zuo)C@C1FG54!e0sW95zDr_=!%W}(Im2W;FaZYQE^s59zeIcbU135f0O~u^o#q)hg#MB{%wvj&3)PUMf zgXO}>agylSzxdkqv#(E!i$$ltK2^g@_M+l)T~Iqq&`78+_QWoZ@YTXFBb1&pGG{i#*Gx~D z(BZ%s>}>BqXwQa-WycwP7EOAQ%XY0rORgS0`q4S_Rb&OL*DWi)w3a}lg7UBBA;p9zEZ0{=nh}Os5aLS0v(`TYR9@}!hQkEDyQ@2l+vxgOOKNt5~?p)#+a+t}eoG^GMk#<_T z`%EM@RXYj~sHk1%k&}e{yKJ#c4|<-+C>`hTz3+XIg7_6-97DjgK7NIOV@T;^Z3}$; zrpub`{vU9Y`1N2Q8w{x2i;HF1zQP|N**_sbX>P8+b=3jWiOhqYkoGNcv5S7hZIHj= zrDgIf#XY(HL zt5I*U=9~()AfAgpe8rkL#avK3jnXjohfeZW#==5Cu6D}Np?aLeg5Fd8YtgBsNQemw z%QVkcAr?Ifv=4;S44-tlR*#Clc=Bchh2!VZ2=`jGj^A?AV`h&dG($D>P)gSO@c{|q zmCPzm{Q&veVp4ShwpjY7$t?HaIn?F-e*d+8$@$48B_=ZeSGnqelst{CGmi-l^^u}B zz|R*K&jVuyYg|*xSw@S_f{6B_7jLLdpIkmtCY_ZA9_%xZUp8B_mz2^d3q+O7Te!J4 zuViwY-8mkPBne#+>8gYKv)#w`(k0S#GC00Hl9XY5r-ftvm}Hx01th0*6*Y$NQgDiN zJi0?x_E$0wR32p=cUdyeQVXYiO5x6^z$d}0exOyaFc(3=djExY1kxggdST-A)quB- zf2xjA!xn0w$0N;;wYK9vFgf?^)(j?8;WxxS9e)`W(pR~U3$4MPXYA7AIUg@^)Y}V-nTvLK=I-oNp|SscBjCZQm1H82SV?LM6QgC#9{NL)Fxeub))IQDm{7#6gRLDM@yeD%A1x2* zhqj0%Qp3ThrqE`s(sfEv>3=mX%Y77(O$FlL+ZREiNL|5X%;M7b{K-J97Koq8vMtF8 zi-h=TojQVsx7Ft^P1a;nnAKDjg@}u@rg$35JwjcKG&`1Dv^9g6>u&p-6miS8bV!qW zrL*S3@ON*^f{^zpGU|#_GtMAe@^I8HUG?37YjHWVs@K{Sp@XDrx?eb=`V(w zk_SK6=CWkO>k;`1*i)^?o8&;0-AfB~JUxBaWZ$D`-;zlytq3Q|4kjapyAD)Sp|$ z@A#g+X!U+|x6J1N`MdkqRpWx7zzt(~oji4APBm>hgpSQ|6jkp({dJCyUq0pQn7c7z z5R{RJq&6E9of|pmdkVNyI{IAytixT^{XfC)!wzZ0;3K7!_wv4LDqH{rvEf&^zd|xu zX8sd&SJMU+5ze-XsX6(kP9q((F^g1i=At(ujNX4tv^}&~e6|pQ>4gep_;Tgp>Y({6 zFAlI&la%%O&6q0opwKJ`f*M(MI7MBprWMXNcJfltAz;?H)dCXgguv?Jc7SGiG~*dm z$sT3nmMk0gcP;IE<2M3O*dQTk@)i0$!=)q;dxXkEoO_JkY9_OzE93;e@kB*gdavge zHh+hzjuE`+h3a{uF>;=^Sf+=QY6;}Rp?rbm=EVor#Wa3EUmkHHzGi4Yn6`UgUwO-pn89g@Dt02s^=3t{r}l(^x}4(Yggv@r&b-6AW&E7Qq_sr59c%v6K4=fio-jDO3J=7vpl@k* zN2>cr|B(g$w>_#{U9>vFEJyIYnWdQ4zBc)f1J zdkqWwGGDW~?tS{Gi6GDb9G#Fwecrm33`Ka>|JM;E(J>_$FDo<-6SUOY0_t;ZQooudE=8cceLHjiqH=Xtx{XV}n}Dahu!|8Gr) zInr{IU{MusYpuHud~I?r?FYVfi0-xzolq~$&faSs=5mT4FgJBwq^%R2DfV9L86ATy z>))&jyTJma|FN5ayMkNLg6g>w=Xqx$*o9+{Ivm5@T)_}^oV5dt^_7vES7>J#S;aK4 zh0y|E@rX#GnYH7OtlinbKA;EJD9>LU%vd7&457EkCYs4JL=#221Ej8Uk&nke1U-DY zIR;Dnv6ImzcWT)4=wLH+0hZb5)3EYm?fw2^;9`SQ61y7nL%{kNo??kMC~P;NlBTu} zvTZDud8sFHBwtc`tex?+)T)n4&BRWDum1bmGe?P6!~-gM5RgrAUPY{3;Qc7Js$F&A zEs&FuGrTuy8nG@CIS)v0TIKo_@gH;wBC=groEj%;s4<2oU#_iQu(As(Q#$KC*WY>J zwA$ zu*`X+;8PIpRW$)K-}td&a6vY=XI4?4TCNU8;L)yI?^9u3=du`Fq=Cm3`jWGN_5nFxwchZma$rGmg_Y10JMOy8cS?eOM9!ubjAd0mK7`4- zOO+t0>aXc5s8a5e2Xv(tft58Re`PDSb2z@pr}jw1+bD!TeDnAoPopYEi6Yu(&z8v~ z>KU6NiFbM<;W!Ih;xo1EN{wg!6QCK6G%EP6<}2TqCfa$Klp@zu2UI0Ur4>XCxdyIY z`FZ6?7CMy_)U*<#6tL*|9m6AH@1!qe+i-iZ;RzsdH^ssu;Obv`)1i2T838&RImwj1 z;_#7Myu&bKq7qUrGixX`{9<+XQUo8D@>-F1Rmm(fn*&zCLv zX1=J9ZSMMXQfcd1iOz-eCcG?qQ{$$N%R9>ddG}w5$pF{^i@)Tu4V;5DBpb4Iv7dH{ zialF@>ci3VOE>w>qWW}GvM^QEHDBi*Kq$ISHFv=hKh7KW`%}sYM$Dj~pRSY<$VFd2 z&i|GPtkStcxO_m1tfonoE&8EIi?N(xzDM=Kc>Zrap8MhPwWCPMQ$#% z;J^3I%?RA~wL8InK`R;(Lk0Bj#xVt-u7MW zG*d@#(G{n?%!Mt$c2k1Ari!2~)V|NH5;%reS8>hd`xJnl%qav7(4IK4dECZAmnze5 zYE6i8fm?D}4RXw7nuA~;s()DX{QURc^pEHAZhfu)0R6!FipFn_m9FI&+!%u36!q` z)<3+ef6RUl_+Yxng>fj|)JNddYRQNh{Szp+)x}CL8km=&B7+1HFA;37KV4)$SHDf* zh6bP>#ewS>ViTTUPHZ!?p1_OMvJ+7LiKWE~p3_G9{$)Rp7Acz_-NV~z@Lmo0{NMrW zJhJi#_(?6Ot`x6$tWyxKZkr1E=he&(LPdsrdE*0l&JqXl_>IFYraYe3HXiFFqL^#> zr5X@CF>>z71lB2ozJuyw8)*-mYJGN3b8RxO7<}I?jnMF#Z#c~0Ttp1{f~9MMD?>Ed z?-98;(5n3RF_s{7p!HWusZ$KpwACFCJ4ZrseCH;FK}F* zSgZUpE)NMrjFds*weJ#G(6x3r6W&F&-5(#fyn1y8dqUfx$tt!8h@Lwus|scREM>H& zKnyfw&U-KL<|yflnuR~d&a{KR=*Z%nKRnZf>-MeTS)ua3tJ~}ik@#(>Wh(;1g)yd% z$!ZDBg`RWAvJ@q%8@h*-c!M?p;~@r`TcwAminHvm{=OFk?wRVx%o9@EtoLZ3U2x2- zgUuG{O9C?G&Jrb9F|T9&aMN$5nU5dg{@FKY%_`mS1Iy|x(LZKZMz)Y{2YrIA6Uj<} z@(AU3i5UHWyeTWh)$Tn7ozaqI@W)CEj4@LO`QR#GE-bn}qXYIB(jmO)!I*{JYEG}_ z`|51)ZO%=;{r3Nc=2)>mZLkxdM8n`?r8foV8tW1-Q*&0(GBSN-f(`Z*AZR6@@8NNN zRaMoW)(dfkH!ImO~YULXFCh}n-uT5N}T7BznSpA zSnX99#9%mL)py@|H;IRm(<)Sn+E0AF{q!GQP2?Q-bfgy%0(o`OC97ZN?j+UZK0%Fw zWQ!p3Yx668n~%?*$m=t@o`*S`Jys1FO7KbDopL}{FLe80UUf@WB% zNvGgCc2+w6d~^~$r5cq_>VDi%zUCZ_X0bu~Uj0 z3Pu#Qf}uGfw@Kzedo}!JwSogdLxq}c>M4&Zqs;sfoZQe^(Y?CeU+MsdaV3rWi;_zJm2 zsJ2EpN~DbBR}(iFOvfD7|Ajn3Uh^mTj{Wo}Nyf~t;irTX3p&!EAcpQfzEY2s{ITUP zVNT#q;-;d&dY>Ucj8jOei}1u|+TpCp2%NC!&H6S8GiBOJx$K0-MctW82Tvuxu#!kJ zVUn;KM*M}+kjMz52c%NB<2x#Q`=bQiO5gI)Y$Dk%WF0f}2>(O1{1!Mlo@H@g=9puF z_7^Yk>v38O8EPs&wt1jU-gi;ZHPDi_fQ_3u#G|NVmT<>KwF2rz6-^E#%Df%3c z(ndUt24!_$?~8_hOjNiT#<=1eEX?ou*ppe#BwuPb{zV!agf__k_*aUvCeL=i(8kub zWReh^Ky2-<6!XN<-uRQdfJ>V98D_#?OGv`*vDC85Am3|Ye726>B_2=xHJ^^63yxpd z#WWB5-pY=vX9ZCskkPpl$63(PJBPi|XL{lh0dX}hn^#u;vAws^RC}vxwO?2rqV(wM zHcEKa#3`XqY)z+hj4^mO*+X5bBscsE<}=Gy{}zlQaf*}8Xjw9Sb}WF06Si?9RC&S# zpYn~K0y-0U8*0~4dSlm_=l+Zug}~wQfovKx63GtHP&8WJz;$9M(RJ7{w)HtQ`9t6 zPzW=LB>AZjA`iTJB!u|mY4q<>R)l!46XBXzh-xo_M_f}A7CQRNeX%bXvt6U%9X?g2 z`+4|-ef>)oQZK}LkqQpUWd- z-~>GCYRXc07ylT%X+ifBi&Cp6t}1$TWWzyb%p(_~?|Pn~+0)68g|#D@Y(0{PNnx4^ za9c7tx=I3yMrsoI)Jz|12Vpio^rT9MM-r{ILi-qfye*p9yuF9C+^zj9W)du2F-?6ef7KJq}kGy zVd#?Ev3v^f$>=W|5`NOKetaBeXQ`P7E5@aANy_fWbhuqc5tUKoMCIpjB`x66_P``@G3qL%OE$1*j-#dfb z`bOOwGyK^=RV2#i#G#@{uYb+{rsrFI@4(m>Mne?#us)uX+_$jrGyaU!j$`jNgprIS^HZA7Vf+0bSS;>hXx8RE ztkU02zD<@On+qsy*Z+aQCoNmwV}UE#LNr507k}p}*?he|Cx=`KGg+P?QmQpAv;bTA~>P(?2qBIbrh>1ZhTwrI`7tW*T0M5QQd=tK}hX|<(>QnZRR zg7)4RT2qQN!7Z&OhW66bP``6O{=fY{oZ-t_&)Uzk&faV7ect!2Dpv9M0_5CHOWo zw5#cdPtHnRI?j16*GU_Hr{pX=E2X}F({m|mae~*ov;y!0GIE&E#u>jaAU1RlSiLXG z1to447yzmcZ^LJuhnr51k(YAO5pt)LElKDZAZipIa(4Lf>Ha(9@C<{H-KUBzsXv!K zpNr4Ckf{6nbIs}(X}^)2EGJ)w6C^dm4*yxVUeC8AouCgZG8xF~T{Bf&l-@00@#eIS zo!vM>oJ5{+=G{R19&pg|%r964^-=#m)yf>D&ZfggRX6e<7O6Lf=wcy+MdzT5e46Z8 zBg^*9Lc3lhI>I^Im@KejL-?Ny_)87M`Ll7yd7;jJxVSGz7yw@y5ynUrzH{i`gVv#r zrC7h-+;|lI*W$8YTzq-!Tb&v{Cn`CFHmk{{>-}9hm^*IE_1F1u%|fyIKm@?hTmsME zD(;NOE#g_$Myfz(yzOJuRMT;ly$=THS7e*=T0UdMqTjyErrkqT-b8I@O#7=o6MH}{ zh}~DH7=>rX35H+V*;2ura&e$)5J_@_#^C7s91XE|Ugy*N9s2M->F+mGUdn#+{}()! za?`b3B=`&B7Tpoq@8?yn$UgJ;AaS5$%A0hHb8L1Ka_nCve!-H;e~~&W5e?pFW|>m` z%Zc;%U5IEh@AFiw#JTSgo!(7DrgcXpT2J>oDeCE-N;FL>kGHMoYJdErK`37+n&S=E zx!@!B>r>9Wow4x8HKO}A66YDkJfXaz8F-0X}8s91nhrG#l()!P}dOKZZ;`^+cl6LYHqq|G4M z(rc@+3t@%|Q@#EvWe2gpA(Hy`&m3>YSLI>;&M^m zEw!(U`mb9`WzFmJw8GysZ&o{9oV{88bZqZ|cE=(+kJnB~Juk#((-n#X%vwq;;;K^V zw)UE1`@B=?TLqed{i2PS=bu!xosF^{&4>2Hfz7uWh!HB)rTs~O(D3rR_K^p z6U=qmEE+s6F`&ookHJc6>bWcTZ zAVVKjnh;IapTG6+F^x=b#G@yb3}MD5WAO;w=o#9V(GA?FGd5uUZ&XcKbjj3o*#@`G4bCn8hgwc9{pkR^Ccpfn&dyo=Vmpt{r z;7i=}%b-N6Q|UvobrSPnka6l~lxvfsOJ8neoLo z7}!%N}GN>bWD-0UJ|1exC8C2noQBVWBVr));Tm+ zBAa823@6^Ck3H`TpO;G%ok0)>TZF#a#J*Kkj%`pVCT4F_25KtxNHXyUJG$d5Bc!yl zmrYB1e&wbm7u!E1n4H6TH4A2%jpfR?jpC}KR$+4|xs%i$)ToE`-X)Rb4ySW8V*O-Z zI~V2&i14c!N!bc#N~c|~3eLkzdLt+fNe9{4L9(|jY_8PYv+7I=$)A9H+$4#*4x4-i zY^+|cDh76KUQR=R5{fF;e?$1$WHV`wNH@@a=h*;JjJAdK`U^>#b@fDa?4NO`4r-9i z!3JX2jCHnB*qrVuVwc~h5^+#tT#xgKope{!>;ns*9pSz)@R@hjf_JNGSm`J6%pq7b zSLA()>Mbd-YF!;s1qMTgefByNC-^YHY%0E30$5<-zk7q;lsC`##F35HOB~PI_nw!O zrrnqy_EuIyP)JTR%D0WbY%tn*TvE9KvtjHfa9yZ=@n`p6k8u&;ZkOXK+vzAYK7akI zLG;P)?zmTPR<9DoUkKBjeq|^M+HP1Y0^38QiCy^rAR3?o1^R1A#77{0`L-^h>zpjZ zoxQ_RUNKQLyTJoPODM0q^i`S&upLP7hae6n^UtV9&BRo1XO zERzGeI$$S4G1ITD>>QJtF(nWkT`=FDnp^@t(@R^WX_a$3>Vfl9v1p_3Z$(FVpz?yO zE|%Bi_J*zPN9=M8rbNxoT_(b%`+q5PUi17hCq?BU`|&qdN?_IEjPn}d-z^y1GE9qz z!pX4&6~IYzD;;G8zhh+kjO?vV%5(#0dcJ*7&Oh2N%aU@pyd<%)lpitv-dQUhu^+|t zWJ_}McrjJ}6JgW7&p(#L=vIKhiR05AeY<5a*$~%$$sszvT$I)bF-h>t z%~^h)mdHJ>I%R=o zUO0RdjQWPv|& zvO`mkZCF~=R+<>0CRc~zN#Fo&fXSLXM1EiE3542qm6*@r$W>*==5Kpnt@nU}0<0Q^ z<9iuiF8=zI&G7ptShD&S0Mt=C_t5=D4gfbR5oI23g3&FW9Bxw3*n(8TSi3bZ61E_2 zM${31@h+S#I1ku?S1;R59eZ5T`QrOo97R&zOA#|SrI4}5SudnXnQ_&dvcen=Iz}!O zXGeLPt&aoh{BhRI^$COKEwISiVwlCyXTd3A66#=$U5|(%<=aS)uaTFnTWyHT;Qn zsR!z|;C%9Y*6$?{PTFP5it{*FMaBuTeZ!-72LWF3#XFD|wj@328^#y?ig`amF3RGC zSy}+CcT$ZX?lQgeSt`5L1}L^|XZz{PQDTvMmbSed>r8ZPxV=gTCgd6hbQzvX%->5! zAtwfrZsY$T8Qio$GBN^6b-yh^+}}RAS^^Yl2lj=g$~o5jI?}@!gAfKEBJbrKiBOOl z9_$X<-=5xRQUiQd6+97ScIadTBxJ6rNiu7TSrB-YIkghye>(#%Z-AgxiV@uu@-;6i z=WOQ~Drg!L?XTyjV(>{fW_AR}MjP@2oC-&@uTPErBOm)4U_+mv-dARbUpuOcO?j9b2-X|n*(*mL?`kaAU}X%o z{!x$lNT?HU117m#7{xM^2kJO8Z;s$sChWJz}%p&^33(`#KF?`GvDU zdv{zkVi65zgwpx&+9{~z{9UzIy-kZJK5%_E!6oE(RAPrDp`H8TCWJvB4ZG|T8K)3k zOog8N;fV&O?Ouu3P@CT>ipy1mU_k0QDxgmu?N zOY?tC;XFQY{aq#0*o({TltA!Pd%;T#`eNEy;t>lpUg>DueB>6yT+r2V zvITru;~YI7@MYzonTcVe(9E5C_?24aHsImgoKFDNeB1P!_XRHme|p5PuO7CGyzC%= zERLB2PHD7`Ojqq)jT@KNQ*2);*HFqY80?+RrhRxJJN=tRQmr`Cd;F0Y6ZPQx>Xc?g%uMGfcuSN+X zA6Cwgt~L-f6{eBIQr9K^D@3;jrz`QsY(;WSp@2_9@*8&UOSTymxYw`e2+Rw8STd`r zYHODo+>q^%4xIE$v^vm6{-W_0*^OtLtUlX^(@-s8elb9On*y(&F<+1nyI97@JD=dggdlSU& z`*nk=B(nFv)E}E#CXY=4;Tw|w-Fs^hML%s19r6lf$P8=l!Xbn2?D?yHAuVtILh+hn zj-c@Y#2JV$6X%VOE-fFpwG|n7XV%ZM>#jPpI|JVKBz?H_T^4&wlQ?f@&jxCHn##jO z4ii*z%o!np8Y3fbPiD)_6c^FV)7fVfX25yMvv`1!HL+_Z-5d9^_)npkp=u6)GRp}A z?8mg^3fK+qdxYs`ht%sre`w%)fne(mtqB`Ds_+SU59sS5eBlq`eEIdp#kC#a*?Bdb zdY!5m000J8{%|7&_>uxG{4WQB4-kDhi8aEs4C65GaK^HRnCC{gW+S8bCYVMe3;+<6 l#S}PyQXKw|WyGa`5Msjr!*VrLrx&yYPTDyht0(we`yYlmQ33z} literal 0 HcmV?d00001 diff --git a/src/pages/Map.js b/src/pages/Map.js index 4dd4178..97eaede 100644 --- a/src/pages/Map.js +++ b/src/pages/Map.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React, { Component, Fragment } from 'react'; import { Map, InfoWindow, Marker, GoogleApiWrapper } from 'google-maps-react'; import Typography from '@material-ui/core/Typography'; @@ -55,13 +55,20 @@ export class MapContainer extends Component { // When the user clicks on the map, if a info window is visible then close it // and 'unactive' that marker - onMapClick = () => { - if (this.state.showingInfoWindow) { - this.setState({ + onMapClick = (props, map, e) => { + if (this.state.showingInfoWindow) { + this.setState({ showingInfoWindow: false, activeMarker: null }); } + + let lat = e.latLng.lat(); + let lng = e.latLng.lng(); + console.log(` + latitude: ${lat} + longitude: ${lng} + `); } // Set the state of the component to contain user coordinates and initial @@ -77,38 +84,53 @@ export class MapContainer extends Component { } render() { + + // TODO: This line is used by the custom marker icon + //const { google } = this.props; + return ( // Render the Google Map, Marker, and InfoWindow components + - - { this.state.selectedPlace.title } - - - { this.state.selectedPlace.name } - + + + + { this.state.selectedPlace.title } + + + { this.state.selectedPlace.name } + + + ); From 603156def79352cd0aef69d8ce99d872708bff5a Mon Sep 17 00:00:00 2001 From: Al Duncanson Date: Fri, 28 Sep 2018 15:21:29 -0400 Subject: [PATCH 11/17] added map --- package-lock.json | 718 +++++++++++++++++++++++++++++++++++++++++++++- src/App.css | 2 +- src/pages/Map.js | 93 +++--- 3 files changed, 764 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78cf340..fd17bd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,155 @@ } } }, + "@firebase/app": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.3.4.tgz", + "integrity": "sha512-Q6sNpWZ3x+FeuBkLCCRrsOraGJOKVLUCc9Amj8zu2vAC1v2uWifRR6kZ60TrpaIxtY4N6pcPTaG0YIUT5lgeSA==", + "requires": { + "@firebase/app-types": "0.3.2", + "@firebase/util": "0.2.2", + "dom-storage": "2.1.0", + "tslib": "1.9.0", + "xmlhttprequest": "1.8.0" + } + }, + "@firebase/app-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.3.2.tgz", + "integrity": "sha512-ZD8lTgW07NGgo75bTyBJA8Lt9+NweNzot7lrsBtIvfciwUzaFJLsv2EShqjBeuhF7RpG6YFucJ6m67w5buCtzw==" + }, + "@firebase/auth": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.7.7.tgz", + "integrity": "sha512-yGKtsWHLVtW/hUjy3hsqslCa7r/PAasJxXa64fOnonW0yXs56hOV7gAobgorsSI0aUXowdf2OR8pedQG/+xUtw==", + "requires": { + "@firebase/auth-types": "0.3.4" + } + }, + "@firebase/auth-types": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.3.4.tgz", + "integrity": "sha512-0r3gSQk9jw5orFHCTUIgao0zan6dHt2J0BO3t/uEzbod+uwqvUn/gh+yg+kK6HX92Fg8E7y030KX4Bw/aXt0Ew==" + }, + "@firebase/database": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.3.6.tgz", + "integrity": "sha512-r02JOqTLcd2/qn7QkkJvIAxMiMxmeyd5B76kl9hHAs+3cil5mUzHnI3svtb4h0VIJYDHFKJMlVl/bE3GfcTR3A==", + "requires": { + "@firebase/database-types": "0.3.2", + "@firebase/logger": "0.1.1", + "@firebase/util": "0.2.2", + "faye-websocket": "0.11.1", + "tslib": "1.9.0" + } + }, + "@firebase/database-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.3.2.tgz", + "integrity": "sha512-9ZYdvYQ6r3aaHJarhUM5Hf6lQWu3ZJme+RR0o8qfBb9L04TL3uNjt+AJFku1ysVPntTn+9GqJjiIB2/OC3JtwA==" + }, + "@firebase/firestore": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-0.8.2.tgz", + "integrity": "sha512-kGHClgRNvKc6b0W5u36kbfP+0mifLw+YQ719Kb6vooeXu8ZmKhRPyrW3qoUZeCRbLwiE6ukaTfweIN2yDpxUug==", + "requires": { + "@firebase/firestore-types": "0.7.0", + "@firebase/logger": "0.1.1", + "@firebase/webchannel-wrapper": "0.2.10", + "grpc": "1.13.1", + "tslib": "1.9.0" + } + }, + "@firebase/firestore-types": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-0.7.0.tgz", + "integrity": "sha512-jyKRcKnSh3CSEPL4xGOZNoOXEiv7YmFK/JEcdd/4cAH17/Xo+Pk67gk1E648LRKh6QPghgNvzNTY5R10mKbQNw==" + }, + "@firebase/functions": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.3.1.tgz", + "integrity": "sha512-6A38x7zPU6zCTyOgGx2v+z4ugcsWnciL6YkcZXLNlCLveUmFdL0DmaW5MEBSpSOOe8kOJMl7f3aaD6lWUHNOBg==", + "requires": { + "@firebase/functions-types": "0.2.0", + "@firebase/messaging-types": "0.2.3", + "isomorphic-fetch": "2.2.1", + "tslib": "1.9.0" + } + }, + "@firebase/functions-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.2.0.tgz", + "integrity": "sha512-q1FB3YKEAnWd+FpIL5Xn0B1BXO2IowrAdrSViXkFxNZVpp9iCzQ8Ytcbr3V1xUr3dnmoW/V7zkZJZGuwBgiVhw==" + }, + "@firebase/logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.1.tgz", + "integrity": "sha512-5jn3HHbEfdOwychyIEIkP1cik+MW/vvoOavTOzwDkH+fv6Bx+HBUOzh09M7sCYzXFtKzjbUax9+g39mJNBLklQ==" + }, + "@firebase/messaging": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.3.6.tgz", + "integrity": "sha512-Sz/fWOXMa3HxDZxE64Fm335kwP9um1rmun5PIka7od7I4hZ8US+SjYVyUe6jWTh1V/YjcqDi6Xkhoj2nF8yu9g==", + "requires": { + "@firebase/messaging-types": "0.2.3", + "@firebase/util": "0.2.2", + "tslib": "1.9.0" + } + }, + "@firebase/messaging-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.2.3.tgz", + "integrity": "sha512-avwCgZzcx2uxIW/wT3p3G/EyHftIrvMyiTS7AA7dxDlzfx+8dpAeTsb1+jsHJT4F6foSh5HG17Nw8sDzYuxH1Q==" + }, + "@firebase/polyfill": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.3.tgz", + "integrity": "sha512-xs8IZf1WEbufYXyfV8YjmiFZOaujRRq0T03NteihYfuGVTTym7z5SmvLvEHLEUjf2fgeobPEzZ2JgrCQHS+QHw==", + "requires": { + "core-js": "2.5.5", + "promise-polyfill": "7.1.2", + "whatwg-fetch": "2.0.4" + }, + "dependencies": { + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + } + } + }, + "@firebase/storage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.2.3.tgz", + "integrity": "sha512-2sq5jckWszW53gfQMkPNc7EumJ92oErRhzGJANbVzBumwR8qwKZU8/I+/uV9SPK1tVmSUc3S21jdoW5oOJVEuA==", + "requires": { + "@firebase/storage-types": "0.2.3", + "tslib": "1.9.0" + } + }, + "@firebase/storage-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.2.3.tgz", + "integrity": "sha512-RaZeam2LgsB7xwAtOQr4G0Geoyf7D5TnLF3a12By6Rh0Z9PqBSlWn0SVYGW3SkmxIdqvWZMZvCyamUlqQvQzWw==" + }, + "@firebase/util": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.2.tgz", + "integrity": "sha512-vfRjmCWuxtJx3txHocaNlDwCDwwv6KLL5YtlSNi73wBdvF3UfnpLGrth7G3X6gn5rDhOKamRg2+9L8cfsjSS1A==", + "requires": { + "tslib": "1.9.0" + } + }, + "@firebase/webchannel-wrapper": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.10.tgz", + "integrity": "sha512-i90GhAH1k1C7EKZHhjsMUIw6vXb7WUsMdbGMrDvFOLRtMKyC/+hHcXfK440PdNnsZpMYsCeJFBpamML806AA4w==" + }, "@material-ui/core": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.1.0.tgz", @@ -337,6 +486,15 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, + "ascli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", + "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", + "requires": { + "colour": "~0.7.1", + "optjs": "~3.2.2" + } + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1593,6 +1751,14 @@ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, + "bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "requires": { + "long": "~3" + } + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -2257,6 +2423,11 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, + "colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" + }, "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", @@ -3018,6 +3189,11 @@ } } }, + "dom-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", + "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" + }, "dom-urls": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", @@ -3981,6 +4157,21 @@ "locate-path": "^2.0.0" } }, + "firebase": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-5.5.2.tgz", + "integrity": "sha512-XfcmQdt2d3ckoEn8XoqX6LHZlFU+5a+tfXpDULIJx+gIQWjnyDJ5VesGgsYLw8Dklq4jBK8q6CI5qWSX+QgYrQ==", + "requires": { + "@firebase/app": "0.3.4", + "@firebase/auth": "0.7.7", + "@firebase/database": "0.3.6", + "@firebase/firestore": "0.8.2", + "@firebase/functions": "0.3.1", + "@firebase/messaging": "0.3.6", + "@firebase/polyfill": "0.3.3", + "@firebase/storage": "0.2.3" + } + }, "flat-cache": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", @@ -4121,11 +4312,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4138,15 +4331,18 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4249,7 +4445,8 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4259,6 +4456,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4271,17 +4469,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -4298,6 +4499,7 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4370,7 +4572,8 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -4380,6 +4583,7 @@ "once": { "version": "1.4.0", "bundled": true, + "optional": true, "requires": { "wrappy": "1" } @@ -4485,6 +4689,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4697,6 +4902,422 @@ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, + "grpc": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.13.1.tgz", + "integrity": "sha512-yl0xChnlUISTefOPU2NQ1cYPh5m/DTatEUV6jdRyQPE9NCrtPq7Gn6J2alMTglN7ufYbJapOd00dvhGurHH6HQ==", + "requires": { + "lodash": "^4.17.5", + "nan": "^2.0.0", + "node-pre-gyp": "^0.10.0", + "protobufjs": "^5.0.3" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "minipass": { + "version": "2.3.3", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true + } + } + }, + "ms": { + "version": "2.0.0", + "bundled": true + }, + "needle": { + "version": "2.2.1", + "bundled": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true + }, + "npm-packlist": { + "version": "1.1.11", + "bundled": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, + "sax": { + "version": "1.2.4", + "bundled": true + }, + "semver": { + "version": "5.5.0", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "tar": { + "version": "4.4.4", + "bundled": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.3", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } + } + }, "gzip-size": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", @@ -6450,6 +7071,11 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -6741,8 +7367,7 @@ "nan": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", - "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==", - "optional": true + "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==" }, "nanomatch": { "version": "1.2.13", @@ -7095,6 +7720,11 @@ "wordwrap": "~1.0.0" } }, + "optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" + }, "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", @@ -8577,6 +9207,11 @@ "asap": "~2.0.3" } }, + "promise-polyfill": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz", + "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==" + }, "prop-types": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", @@ -8586,6 +9221,61 @@ "object-assign": "^4.1.1" } }, + "protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "requires": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, "proxy-addr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", @@ -10563,6 +11253,11 @@ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -11502,6 +12197,11 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/src/App.css b/src/App.css index 09e6b2b..2d57aaa 100644 --- a/src/App.css +++ b/src/App.css @@ -2,6 +2,6 @@ body { margin: 0; } -header + div > div { +.google-map-container > div { height: 92% !important; } \ No newline at end of file diff --git a/src/pages/Map.js b/src/pages/Map.js index 97eaede..58fbd06 100644 --- a/src/pages/Map.js +++ b/src/pages/Map.js @@ -6,7 +6,7 @@ import Typography from '@material-ui/core/Typography'; const API_KEY = 'AIzaSyAZ_0J01bA6wCbIPK4UBq2RUBC-hIqG4mM'; // Map container styles -const style = { +const mapStyles = { width: '100%', height: '100%' } @@ -90,49 +90,64 @@ export class MapContainer extends Component { return ( // Render the Google Map, Marker, and InfoWindow components - +

); } } From d0d9820699b7a7c6e5153aa4ffeaea45e2720df8 Mon Sep 17 00:00:00 2001 From: Al Duncanson Date: Tue, 2 Oct 2018 14:51:26 -0400 Subject: [PATCH 12/17] map renders markers on click, sends lat and lng to firebase, yeet --- package-lock.json | 13 +- src/App.css | 1 + src/components/ReportForm.js | 252 ++++++++++++++++++++--------------- src/pages/Map.js | 48 +++---- src/pages/Report.js | 3 - 5 files changed, 171 insertions(+), 146 deletions(-) diff --git a/package-lock.json b/package-lock.json index fd17bd1..87e56ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4294,7 +4294,8 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -4659,7 +4660,8 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true + "bundled": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4707,6 +4709,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4745,11 +4748,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "yallist": { "version": "3.0.2", - "bundled": true + "bundled": true, + "optional": true } } }, diff --git a/src/App.css b/src/App.css index 2d57aaa..2134e4d 100644 --- a/src/App.css +++ b/src/App.css @@ -4,4 +4,5 @@ body { .google-map-container > div { height: 92% !important; + width: 50% !important; } \ No newline at end of file diff --git a/src/components/ReportForm.js b/src/components/ReportForm.js index 4dd046e..15e607f 100644 --- a/src/components/ReportForm.js +++ b/src/components/ReportForm.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {Fragment} from 'react'; import PropTypes from 'prop-types'; import Grid from '@material-ui/core/Grid'; import { withStyles } from '@material-ui/core/styles'; @@ -6,6 +6,7 @@ import MenuItem from '@material-ui/core/MenuItem'; import TextField from '@material-ui/core/TextField'; import Button from '@material-ui/core/Button'; import firebase from '../firebase.js'; +import MapContainer from '../pages/Map'; /** * Styles that the different @@ -138,7 +139,9 @@ class ReportForm extends React.Component { time: '00:00', type: 'visual', confidence: '1', - desc: '' + desc: '', + lat: '', + lng: '' }; /** @@ -151,6 +154,20 @@ class ReportForm extends React.Component { }); }; + /* + * Get the coordinates + * + */ + getCoordinates = (lat,lng) => { + let latitude = lat; + let longitude = lng; + + this.setState({ + lat: latitude, + lng: longitude + }); + } + /** * Event listener for form. * When the form is submitted, @@ -165,7 +182,9 @@ class ReportForm extends React.Component { confidence: this.state.confidence, date: this.state.date, time: this.state.time, - desc: this.state.desc + desc: this.state.desc, + lat: this.state.lat, + lng: this.state.lng } sightingsRef.push(sighting); this.setState({ @@ -173,7 +192,9 @@ class ReportForm extends React.Component { time: '00:00', type: 'visual', confidence: '1', - desc: '' + desc: '', + lat: '', + lng: '' }); }; @@ -188,118 +209,127 @@ class ReportForm extends React.Component { * The actual form. */ return ( -
- - - - {sightingTypes.map(option => ( - - {option.label} - - ))} - - + + + + + + + + {sightingTypes.map(option => ( + + {option.label} + + ))} + + - - - {confidenceLevels.map(option => ( - - {option.label} - - ))} - - + + + {confidenceLevels.map(option => ( + + {option.label} + + ))} + + - - - + + + - - - + + + - - + + + + + + + + + + + + - - - - - - + + ); } } diff --git a/src/pages/Map.js b/src/pages/Map.js index 58fbd06..806b961 100644 --- a/src/pages/Map.js +++ b/src/pages/Map.js @@ -63,12 +63,17 @@ export class MapContainer extends Component { }); } + this.setState({ + markerLatLng: { + lat: e.latLng.lat(), + lng: e.latLng.lng() + } + }) + let lat = e.latLng.lat(); - let lng = e.latLng.lng(); - console.log(` - latitude: ${lat} - longitude: ${lng} - `); + let lng = e.latLng.lng(); + + this.props.onClick(lat,lng); } // Set the state of the component to contain user coordinates and initial @@ -78,6 +83,10 @@ export class MapContainer extends Component { lat: 42.9634, lng: 85.6681 }, + markerLatLng: { + lat: 0, + lng: 0 + }, showingInfoWindow: false, activeMarker: {}, selectedPlace: {} @@ -99,11 +108,15 @@ export class MapContainer extends Component { defaultZoom = { 15 } onClick = { this.onMapClick } > + + - - - - - - diff --git a/src/pages/Report.js b/src/pages/Report.js index 8a7909d..c9042d9 100644 --- a/src/pages/Report.js +++ b/src/pages/Report.js @@ -1,13 +1,10 @@ import React, { Component } from 'react'; import ReportForm from '../components/ReportForm'; -import Typography from '@material-ui/core/Typography'; class Report extends Component { render() { return ( - - ); } } From 2cb980822bd53d7742c79c92a4bb3dcb880b6d85 Mon Sep 17 00:00:00 2001 From: Al Duncanson Date: Tue, 2 Oct 2018 15:10:02 -0400 Subject: [PATCH 13/17] changed textField width --- src/components/ReportForm.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ReportForm.js b/src/components/ReportForm.js index 15e607f..95c87ff 100644 --- a/src/components/ReportForm.js +++ b/src/components/ReportForm.js @@ -23,6 +23,7 @@ const styles = theme => ({ marginRight: theme.spacing.unit, marginTop: theme.spacing.unit * 2, flexBasis: 280, + width: '90%' }, button: { marginLeft: theme.spacing.unit * 2, From 9dc5c4d69c4ba358955a810089787e64a4e34bfc Mon Sep 17 00:00:00 2001 From: Al Duncanson Date: Wed, 3 Oct 2018 16:41:09 -0400 Subject: [PATCH 14/17] added check for props --- src/pages/Map.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/Map.js b/src/pages/Map.js index 806b961..d738508 100644 --- a/src/pages/Map.js +++ b/src/pages/Map.js @@ -73,7 +73,9 @@ export class MapContainer extends Component { let lat = e.latLng.lat(); let lng = e.latLng.lng(); - this.props.onClick(lat,lng); + if (this.props.onClick) { + this.props.onClick(lat,lng); + } } // Set the state of the component to contain user coordinates and initial From 7dd828a38c034a7a3fa9b7365ae1c063f1933625 Mon Sep 17 00:00:00 2001 From: Al Duncanson Date: Thu, 4 Oct 2018 17:19:27 -0400 Subject: [PATCH 15/17] split maps into multiple components, render sighting markers in real time, pull sighting info into marker info boxes --- .vscode/settings.json | 2 + src/App.css | 6 +- src/components/Main.js | 8 +- src/components/ReportForm.js | 4 +- src/{pages/Map.js => components/ReportMap.js} | 2 +- src/components/SightingMap.js | 197 ++++++++++++++++++ src/pages/{Sighting.js => SightingList.js} | 0 src/pages/ViewMap.js | 14 ++ 8 files changed, 225 insertions(+), 8 deletions(-) create mode 100644 .vscode/settings.json rename src/{pages/Map.js => components/ReportMap.js} (98%) create mode 100644 src/components/SightingMap.js rename src/pages/{Sighting.js => SightingList.js} (100%) create mode 100644 src/pages/ViewMap.js diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/src/App.css b/src/App.css index 2134e4d..9dd2624 100644 --- a/src/App.css +++ b/src/App.css @@ -2,7 +2,11 @@ body { margin: 0; } -.google-map-container > div { +.report-google-map-container > div { height: 92% !important; width: 50% !important; +} + +.sighting-google-map-container > div { + height: 92% !important; } \ No newline at end of file diff --git a/src/components/Main.js b/src/components/Main.js index 34951bd..2259d17 100644 --- a/src/components/Main.js +++ b/src/components/Main.js @@ -6,9 +6,9 @@ import Tabs from '@material-ui/core/Tabs'; import Tab from '@material-ui/core/Tab'; import Typography from '@material-ui/core/Typography'; import Home from '../pages/Home'; -import Map from '../pages/Map'; +import ViewMap from '../pages/ViewMap'; import Quiz from '../pages/Quiz'; -import Sighting from '../pages/Sighting'; +import SightingList from '../pages/SightingList'; import Report from '../pages/Report'; import Info from '../pages/Info'; @@ -58,9 +58,9 @@ class SimpleTabs extends React.Component { {value === 0 && } {value === 1 && } - {value === 2 && } + {value === 2 && } {value === 3 && } - {value === 4 && } + {value === 4 && } {value === 5 && } ); diff --git a/src/components/ReportForm.js b/src/components/ReportForm.js index 95c87ff..ac72000 100644 --- a/src/components/ReportForm.js +++ b/src/components/ReportForm.js @@ -6,7 +6,7 @@ import MenuItem from '@material-ui/core/MenuItem'; import TextField from '@material-ui/core/TextField'; import Button from '@material-ui/core/Button'; import firebase from '../firebase.js'; -import MapContainer from '../pages/Map'; +import GoogleMap from '../components/ReportMap'; /** * Styles that the different @@ -326,7 +326,7 @@ class ReportForm extends React.Component {
- +
diff --git a/src/pages/Map.js b/src/components/ReportMap.js similarity index 98% rename from src/pages/Map.js rename to src/components/ReportMap.js index d738508..5d697bf 100644 --- a/src/pages/Map.js +++ b/src/components/ReportMap.js @@ -101,7 +101,7 @@ export class MapContainer extends Component { return ( // Render the Google Map, Marker, and InfoWindow components -
+
{ + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition((position) => { + this.setState({ + myLatLng: { + lat: position.coords.latitude, + lng: position.coords.longitude + } + } + ); + }) + } else { + // If browser doesn't support geolocation or if user does not allow it, + // center map on Grand Rapids, Michigan + this.setState({ + myLatLng: { + lat: 42.9634, + lng: 85.6681 + } + } + ); + } + } + + //DOPE: this converts a firebase snapshot (js object) to an array + snapshotToArray = (snapshot) => { + var returnArr = []; + + snapshot.forEach(function(childSnapshot) { + var item = childSnapshot.val(); + item.key = childSnapshot.key; + + returnArr.push(item); + }); + + return returnArr; + } + + // When the component has mounted to the DOM, get the user's location + componentDidMount() { + this.getLocation(); + + //DOPE: So initially I was using this to print the array of sightings to the console + const sightingsRef = firebase.database().ref('sightings'); + + sightingsRef.on('value', (snapshot) => { + console.log(this.snapshotToArray(snapshot)); + }); + + //DOPE: Instead, make the snapshot into an object and store it in the component state + sightingsRef.on('value', (snapshot) => { + let sightings = snapshot.val(); + let newState = []; + for (let sighting in sightings) { + newState.push({ + id: sighting, + lat: sightings[sighting].lat, + lng: sightings[sighting].lng, + desc: sightings[sighting].desc, + type: sightings[sighting].type, + confidence: sightings[sighting].confidence, + date: sightings[sighting].date, + time: sightings[sighting].time + }); + } + this.setState({ + sightings: newState + }); + }); + } + + // When the user clicks on a marker, pass the props related to that marker + // and show the related info window + onMarkerClick = (props, marker) => { + this.setState({ + selectedPlace: props, + activeMarker: marker, + showingInfoWindow: true + }); + } + + onMapClick = (props, map, e) => { + if (this.state.showingInfoWindow) { + this.setState({ + showingInfoWindow: false, + activeMarker: null + }); + } + } + + // Set the state of the component to contain user coordinates and initial + // marker and info window information + state = { + myLatLng: { + lat: 42.9634, + lng: 85.6681 + }, + showingInfoWindow: false, + activeMarker: {}, + selectedPlace: {}, + sightings: [] + } + + render() { + + // TODO: This line is used by the custom marker icon + //const { google } = this.props; + + return ( + // Render the Google Map, Marker, and InfoWindow components +
+ + + + + {/*DOPE: Then map the data from each sighting in sightings onto Marker props */} + { this.state.sightings.map((sighting) => { + return ( + + ) + })} + + + + + + { this.state.selectedPlace.type } + + + { this.state.selectedPlace.confidence } + + + { this.state.selectedPlace.date } + + + { this.state.selectedPlace.time } + + + { this.state.selectedPlace.description } + + + + +
+ ); + } +} + +// Send the Google Map API Key with the MapContainer component +export default GoogleApiWrapper({ + apiKey: (API_KEY) +})(MapContainer) \ No newline at end of file diff --git a/src/pages/Sighting.js b/src/pages/SightingList.js similarity index 100% rename from src/pages/Sighting.js rename to src/pages/SightingList.js diff --git a/src/pages/ViewMap.js b/src/pages/ViewMap.js new file mode 100644 index 0000000..6187d45 --- /dev/null +++ b/src/pages/ViewMap.js @@ -0,0 +1,14 @@ +import React, { Component } from 'react'; +import GoogleMap from '../components/SightingMap'; + +class Sighting extends Component { + render() { + return ( +
+ +
+ ); + } +} + +export default Sighting; \ No newline at end of file From 861dc783bf5f53b97190a601e7f7e3739954d2b4 Mon Sep 17 00:00:00 2001 From: Al Duncanson Date: Thu, 4 Oct 2018 18:30:20 -0400 Subject: [PATCH 16/17] edited the current location marker --- src/components/SightingMap.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/SightingMap.js b/src/components/SightingMap.js index aebaa72..e5cf808 100644 --- a/src/components/SightingMap.js +++ b/src/components/SightingMap.js @@ -137,8 +137,7 @@ export class MapContainer extends Component { { return ( Date: Thu, 4 Oct 2018 18:34:06 -0400 Subject: [PATCH 17/17] removed todos, fixmes --- src/components/SightingMap.js | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/src/components/SightingMap.js b/src/components/SightingMap.js index e5cf808..e2c3e89 100644 --- a/src/components/SightingMap.js +++ b/src/components/SightingMap.js @@ -39,32 +39,12 @@ export class MapContainer extends Component { } } - //DOPE: this converts a firebase snapshot (js object) to an array - snapshotToArray = (snapshot) => { - var returnArr = []; - - snapshot.forEach(function(childSnapshot) { - var item = childSnapshot.val(); - item.key = childSnapshot.key; - - returnArr.push(item); - }); - - return returnArr; - } - // When the component has mounted to the DOM, get the user's location componentDidMount() { this.getLocation(); - //DOPE: So initially I was using this to print the array of sightings to the console const sightingsRef = firebase.database().ref('sightings'); - sightingsRef.on('value', (snapshot) => { - console.log(this.snapshotToArray(snapshot)); - }); - - //DOPE: Instead, make the snapshot into an object and store it in the component state sightingsRef.on('value', (snapshot) => { let sightings = snapshot.val(); let newState = []; @@ -119,10 +99,6 @@ export class MapContainer extends Component { } render() { - - // TODO: This line is used by the custom marker icon - //const { google } = this.props; - return ( // Render the Google Map, Marker, and InfoWindow components
@@ -138,15 +114,8 @@ export class MapContainer extends Component { position = { this.state.myLatLng } onClick = { this.onMarkerClick } type = { 'You are here' } - // FIXME: fix custom icon - // icon={{ - // url: "../images/marten-icon.png", - // anchor: new google.maps.Point(32,32), - // scaledSize: new google.maps.Size(64,64) - // }} /> - {/*DOPE: Then map the data from each sighting in sightings onto Marker props */} { this.state.sightings.map((sighting) => { return (