36 files changed, 4808 insertions, 0 deletions
diff --git a/core/settings/citytime/.cvsignore b/core/settings/citytime/.cvsignore new file mode 100644 index 0000000..d316ac9 --- a/dev/null +++ b/core/settings/citytime/.cvsignore @@ -0,0 +1,5 @@ +moc_* +*.moc +Makefile +citytimebase.cpp +citytimebase.h diff --git a/core/settings/citytime/Makefile.in b/core/settings/citytime/Makefile.in new file mode 100644 index 0000000..b058021 --- a/dev/null +++ b/core/settings/citytime/Makefile.in @@ -0,0 +1,184 @@ +############################################################################# + +####### Compiler, tools and options + +CXX = $(SYSCONF_CXX) $(QT_CXX_MT) +CXXFLAGS= $(SYSCONF_CXXFLAGS_QT) $(SYSCONF_CXXFLAGS) +CC = $(SYSCONF_CC) $(QT_C_MT) +CFLAGS = $(SYSCONF_CFLAGS) +INCPATH = -I$(QPEDIR)/include +LFLAGS = $(SYSCONF_LFLAGS_QT) $(SYSCONF_RPATH_QT) $(SYSCONF_LFLAGS) $(QT_LFLAGS_MT) +LIBS = $(SUBLIBS) -lqpe $(SYSCONF_LIBS_QT) $(SYSCONF_LIBS) $(SYSCONF_LIBS_QTAPP) +MOC = $(SYSCONF_MOC) +UIC = $(SYSCONF_UIC) + +####### Target + +DESTDIR = $(QPEDIR)/bin/ +VER_MAJ = 1 +VER_MIN = 0 +VER_PATCH = 0 +TARGET = citytime +TARGET1 = lib$(TARGET).so.$(VER_MAJ) + +####### Files + +HEADERS = citytime.h \ + zonemap.h \ + sun.h \ + stylusnormalizer.h +SOURCES = citytime.cpp \ + zonemap.cpp \ + main.cpp \ + sun.c \ + stylusnormalizer.cpp +OBJECTS = citytime.o \ + zonemap.o \ + main.o \ + sun.o \ + stylusnormalizer.o \ + citytimebase.o +INTERFACES = citytimebase.ui +UICDECLS = citytimebase.h +UICIMPLS = citytimebase.cpp +SRCMOC = moc_citytime.cpp \ + moc_zonemap.cpp \ + moc_stylusnormalizer.cpp \ + moc_citytimebase.cpp +OBJMOC = moc_citytime.o \ + moc_zonemap.o \ + moc_stylusnormalizer.o \ + moc_citytimebase.o + + +####### Implicit rules + +.SUFFIXES: .cpp .cxx .cc .C .c + +.cpp.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.cxx.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.cc.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.C.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.c.o: + $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< + +####### Build rules + + +all: $(DESTDIR)$(TARGET) + +$(DESTDIR)$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS) + $(SYSCONF_LINK) $(LFLAGS) -o $(DESTDIR)$(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) + +moc: $(SRCMOC) + +tmake: + tmake citytime.pro + +clean: + -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) + -rm -f *~ core + -rm -f allmoc.cpp + +####### Extension Modules + +listpromodules: + @echo + +listallmodules: + @echo + +listaddonpromodules: + @echo + +listaddonentmodules: + @echo + + +REQUIRES= + +####### Sub-libraries + + +###### Combined headers + + + +####### Compile + +citytime.o: citytime.cpp \ + zonemap.h \ + stylusnormalizer.h \ + citytime.h \ + citytimebase.h \ + $(QPEDIR)/include/qpe/qpeapplication.h \ + $(QPEDIR)/include/qpe/config.h \ + $(QPEDIR)/include/qpe/timestring.h \ + $(QPEDIR)/include/qpe/tzselect.h \ + $(QPEDIR)/include/qpe/qcopenvelope_qws.h + +zonemap.o: zonemap.cpp \ + sun.h \ + zonemap.h \ + stylusnormalizer.h \ + $(QPEDIR)/include/qpe/resource.h \ + $(QPEDIR)/include/qpe/timestring.h \ + $(QPEDIR)/include/qpe/qpeapplication.h + +main.o: main.cpp \ + citytime.h \ + citytimebase.h \ + $(QPEDIR)/include/qpe/qpeapplication.h + +sun.o: sun.c \ + sun.h \ + $(QPEDIR)/include/qpe/qmath.h + +stylusnormalizer.o: stylusnormalizer.cpp \ + stylusnormalizer.h + +citytimebase.h: citytimebase.ui + $(UIC) citytimebase.ui -o $(INTERFACE_DECL_PATH)/citytimebase.h + +citytimebase.cpp: citytimebase.ui + $(UIC) citytimebase.ui -i citytimebase.h -o citytimebase.cpp + +citytimebase.o: citytimebase.cpp \ + citytimebase.h \ + citytimebase.ui + +moc_citytime.o: moc_citytime.cpp \ + citytime.h \ + citytimebase.h + +moc_zonemap.o: moc_zonemap.cpp \ + zonemap.h \ + stylusnormalizer.h + +moc_stylusnormalizer.o: moc_stylusnormalizer.cpp \ + stylusnormalizer.h + +moc_citytimebase.o: moc_citytimebase.cpp \ + citytimebase.h + +moc_citytime.cpp: citytime.h + $(MOC) citytime.h -o moc_citytime.cpp + +moc_zonemap.cpp: zonemap.h + $(MOC) zonemap.h -o moc_zonemap.cpp + +moc_stylusnormalizer.cpp: stylusnormalizer.h + $(MOC) stylusnormalizer.h -o moc_stylusnormalizer.cpp + +moc_citytimebase.cpp: citytimebase.h + $(MOC) citytimebase.h -o moc_citytimebase.cpp + + diff --git a/core/settings/citytime/citytime.cpp b/core/settings/citytime/citytime.cpp new file mode 100644 index 0000000..b2f9f14 --- a/dev/null +++ b/core/settings/citytime/citytime.cpp @@ -0,0 +1,272 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "zonemap.h" +#include "citytime.h" + +#include <qpe/qpeapplication.h> +#include <qpe/config.h> +#include <qpe/timestring.h> +#include <qpe/tzselect.h> +#if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP) +#include <qpe/qcopenvelope_qws.h> +#endif + + +#include <qdir.h> +#include <qfile.h> +#include <qlabel.h> +#include <qmessagebox.h> +#include <qregexp.h> +#include <qtextstream.h> +#include <qtoolbutton.h> + +#include <stdlib.h> + +CityTime::CityTime( QWidget *parent, const char* name, + WFlags fl ) + : CityTimeBase( parent, name, fl ), + strRealTz(0), + bAdded(false) +{ + Config config( "qpe" ); + bWhichClock = config.readBoolEntry( "AMPM", TRUE ); + frmMap->changeClock( bWhichClock ); + + char *pEnv; + pEnv = NULL; + pEnv = getenv("TZ"); + if ( pEnv ) + strRealTz = pEnv; + pEnv = NULL; + pEnv = getenv("HOME"); + if ( pEnv ) + strHome = pEnv; + // append the labels to their respective lists... + listCities.setAutoDelete( true ); + listTimes.setAutoDelete( true ); + + listCities.append( cmdCity1 ); + listCities.append( cmdCity2 ); + listCities.append( cmdCity3 ); + + listTimes.append( lblCTime1 ); + listTimes.append( lblCTime2 ); + listTimes.append( lblCTime3 ); + + + // kludgy way of getting the screen size so we don't have to depend + // on a resize event... + QWidget *d = QApplication::desktop(); + if ( d->width() < d->height() ) { + // append for that 4 down look + + listCities.append( cmdCity4 ); + listCities.append( cmdCity5 ); + listCities.append( cmdCity6 ); + listTimes.append( lblCTime4 ); + listTimes.append( lblCTime5 ); + listTimes.append( lblCTime6 ); + lblCTime7->hide(); + lblCTime8->hide(); + lblCTime9->hide(); + cmdCity7->hide(); + cmdCity8->hide(); + cmdCity9->hide(); + } else { + listCities.append( cmdCity7 ); + listCities.append( cmdCity8 ); + listCities.append( cmdCity9 ); + listTimes.append( lblCTime7 ); + listTimes.append( lblCTime8 ); + listTimes.append( lblCTime9 ); + lblCTime4->hide(); + lblCTime5->hide(); + lblCTime6->hide(); + cmdCity4->hide(); + cmdCity5->hide(); + cmdCity6->hide(); + } + bAdded = true; + readInTimes(); + changed = FALSE; + QObject::connect( qApp, SIGNAL( clockChanged(bool) ), + this, SLOT( changeClock(bool) ) ); + // now start the timer so we can update the time quickly every second + timerEvent( 0 ); +} + +CityTime::~CityTime() +{ + if ( changed ) { + Config cfg("CityTime"); + cfg.setGroup("TimeZones"); + QListIterator<QToolButton> itCity( listCities ); + int i; + bool realTzWritten = FALSE; + for ( i = 0, itCity.toFirst(); i < CITIES; i++, ++itCity ) { + if ( !strCityTz[i].isNull() ) { + cfg.writeEntry("Zone"+QString::number(i), strCityTz[i]); + cfg.writeEntry("ZoneName"+QString::number(i), itCity.current()->text()); + if ( strCityTz[i] == strRealTz ) + realTzWritten = TRUE; + } + } + if ( realTzWritten ) { + cfg.removeEntry("Zone"+QString::number(CITIES)); + cfg.removeEntry("ZoneName"+QString::number(CITIES)); + } else { + cfg.writeEntry("Zone"+QString::number(CITIES), strRealTz); + if ( nameRealTz.isEmpty() ) { + int i = strRealTz.find( '/' ); + nameRealTz = strRealTz.mid( i+1 ); + } + cfg.writeEntry("ZoneName"+QString::number(CITIES), nameRealTz); + } + QCopEnvelope ( "QPE/System", "timeZoneListChange()" ); + + changed = FALSE; + } + // restore the timezone, just in case we messed with it and + // are destroyed at an inoppurtune moment + if ( !strRealTz.isNull() ) { + // this should be checked, but there is not much that can done at this + //point if it fails + setenv( "TZ", strRealTz, true ); + } +} + +void CityTime::timerEvent( QTimerEvent *e ) +{ + if ( e ) + killTimer( timerId ); + // change the time again!! + showTime(); + int ms = 1000 - QTime::currentTime().msec(); + timerId = startTimer( ms ); +} + +void CityTime::mousePressEvent( QMouseEvent * ) +{ + // DEBUG enable this to get a look at the zone information DEBUG +// frmMap->showZones(); +} + +void CityTime::showTime( void ) +{ + int i; + QListIterator<QLabel> itTime(listTimes); + + // traverse the list... + for ( i = 0, itTime.toFirst(); i < CITIES; i++, ++itTime) { + if ( !strCityTz[i].isNull() ) { + if ( setenv( "TZ", strCityTz[i], true ) == 0 ) { + itTime.current()->setText( TimeString::shortTime(bWhichClock) ); + } else { + QMessageBox::critical( this, tr( "Time Changing" ), + tr( "There was a problem setting timezone %1" ) + .arg( QString::number( i + 1 ) ) ); + } + } + } + // done playing around... put it all back + unsetenv( "TZ" ); + if ( !strRealTz.isNull() ) { + if ( setenv( "TZ", strRealTz, true ) != 0 ) { + QMessageBox::critical( this, tr( "Restore Time Zone" ), + tr( "There was a problem setting your timezone." + "Your time may be wrong now..." ) ); + } + } +} + +void CityTime::beginNewTz() +{ + frmMap->setFocus(); +} + +void CityTime::slotNewTz( const QString & strNewCountry, + const QString & strNewCity ) +{ + // determine what to do based on what putton is pressed... + QListIterator<QToolButton> itCity(listCities); + int i; + // go through the list and make adjustments based on which button is on + for ( i = 0, itCity.toFirst(); itCity.current(), i < CITIES; i++, ++itCity ) { + QToolButton *cmdTmp = itCity.current(); + if ( cmdTmp->isOn() ) { + strCityTz[i] = strNewCountry + strNewCity; + QString s = strNewCity; + cmdTmp->setText( s.replace( QRegExp("_"), " " ) ); + cmdTmp->toggle(); + // we can actually break, since there is only one button + // that is ever pressed! + changed = TRUE; + break; + } + } + showTime(); +} + +void CityTime::readInTimes( void ) +{ + Config cfg("CityTime"); + cfg.setGroup("TimeZones"); + QListIterator<QToolButton> itCity( listCities ); + int i=0; + nameRealTz = QString::null; + QString zn; + for ( ; i < CITIES ; i++ ) { + zn = cfg.readEntry("Zone"+QString::number(i), QString::null); + if ( zn.isNull() ) + break; + QString nm = cfg.readEntry("ZoneName"+QString::number(i)); + strCityTz[i] = zn; + itCity.current()->setText(nm); + if ( zn == strRealTz ) + nameRealTz = nm; + ++itCity; + } + if ( i == 0 ) { + // write in our own in a shameless self promotion and some humor + QStringList list = timezoneDefaults(); + int i; + QStringList::Iterator it = list.begin(); + for ( i = 0, itCity.toFirst(); i < CITIES && itCity.current(); + i++, ++itCity ) { + strCityTz[i] = *it++; + itCity.current()->setText( *it++ ); + } + } + if ( nameRealTz.isEmpty() ) { + //remember the current time zone even if we don't have room + //to show it. + zn = cfg.readEntry("Zone"+QString::number(CITIES), QString::null); + if ( zn == strRealTz ) + nameRealTz = cfg.readEntry("ZoneName"+QString::number(CITIES)); + i++; + } +} + +void CityTime::changeClock( bool newClock ) +{ + bWhichClock = newClock; + showTime(); +} diff --git a/core/settings/citytime/citytime.h b/core/settings/citytime/citytime.h new file mode 100644 index 0000000..5a2c4d8 --- a/dev/null +++ b/core/settings/citytime/citytime.h @@ -0,0 +1,66 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef TIMEWIDGETIMPL_H +#define TIMEWIDGETIMPL_H + +#include <qlist.h> +#include <qwidget.h> + +#include "citytimebase.h" + +const int CITIES = 6; // the number of cities... + +class ZoneMap; + +class CityTime : public CityTimeBase +{ + Q_OBJECT +public: + CityTime(QWidget* parent = 0, const char *name = 0, WFlags fl = 0); + ~CityTime(); + +public slots: + void beginNewTz(); + void slotNewTz( const QString& strNewCountry, const QString& strNewCity ); + void changeClock( bool newClock ); + +protected: + void timerEvent( QTimerEvent* ); + void mousePressEvent( QMouseEvent* event ); + +private: + void showTime( void ); // get and show the time for various places... + void readInTimes( void ); // a method to get information from the config + QString strRealTz; // save the TZ var + QString nameRealTz; // and what it is called + QString strHome; // the home variable... + bool bAdded; // a flag to indicate things have been added... + bool bWhichClock; + int timerId; + + // a spot to hold the time zone for each city + QString strCityTz[CITIES]; + QList<QToolButton> listCities; + QList<QLabel> listTimes; + bool changed; +}; + +#endif diff --git a/core/settings/citytime/citytime.pro b/core/settings/citytime/citytime.pro new file mode 100644 index 0000000..d988b48 --- a/dev/null +++ b/core/settings/citytime/citytime.pro @@ -0,0 +1,13 @@ +# $Id$ +CONFIG += qt warn_on release +TEMPLATE = app +DESTDIR = $(QPEDIR)/bin +INTERFACES = citytimebase.ui +HEADERS = citytime.h zonemap.h sun.h stylusnormalizer.h +SOURCES = citytime.cpp zonemap.cpp main.cpp sun.c stylusnormalizer.cpp +TARGET = citytime +INCLUDEPATH += $(QPEDIR)/include +DEPENDPATH += $(QPEDIR)/include +LIBS += -lqpe + +TRANSLATIONS = ../i18n/de/citytime.ts diff --git a/core/settings/citytime/citytimebase.ui b/core/settings/citytime/citytimebase.ui new file mode 100644 index 0000000..4665097 --- a/dev/null +++ b/core/settings/citytime/citytimebase.ui @@ -0,0 +1,1199 @@ +<!DOCTYPE UI><UI> +<class>CityTimeBase</class> +<comment>********************************************************************* +** Copyright (C) 2001 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +** $Id$ +** +*********************************************************************</comment> +<author>Trenton Schulz</author> +<widget> + <class>QWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>CityTimeBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>289</width> + <height>359</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>City Time</string> + </property> + <property> + <name>layoutMargin</name> + </property> + <property> + <name>layoutSpacing</name> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>3</number> + </property> + <widget> + <class>ZoneMap</class> + <property stdset="1"> + <name>name</name> + <cstring>frmMap</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + </sizepolicy> + </property> + </widget> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout2</cstring> + </property> + <property> + <name>layoutMargin</name> + </property> + <property> + <name>layoutSpacing</name> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>4</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>3</number> + </property> + <widget row="0" column="2" > + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdCity7</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>focusPolicy</name> + <enum>TabFocus</enum> + </property> + <property stdset="1"> + <name>text</name> + <string><location 4></string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget row="2" column="3" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblCTime9</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string><CITY 6 TIME></string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget row="1" column="2" > + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdCity8</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>focusPolicy</name> + <enum>TabFocus</enum> + </property> + <property stdset="1"> + <name>text</name> + <string><location 5></string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget row="1" column="0" > + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdCity2</cstring> + </property> + <property stdset="1"> + <name>font</name> + <font> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>focusPolicy</name> + <enum>TabFocus</enum> + </property> + <property stdset="1"> + <name>text</name> + <string><location 2></string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget row="5" column="1" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblCTime6</cstring> + </property> + <property stdset="1"> + <name>font</name> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string><CITY 6 TIME></string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget row="5" column="0" > + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdCity6</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>focusPolicy</name> + <enum>TabFocus</enum> + </property> + <property stdset="1"> + <name>text</name> + <string><location 6></string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget row="3" column="0" > + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdCity4</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>focusPolicy</name> + <enum>TabFocus</enum> + </property> + <property stdset="1"> + <name>text</name> + <string><location 4></string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget row="4" column="1" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblCTime5</cstring> + </property> + <property stdset="1"> + <name>font</name> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string><CITY 5 TIME></string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget row="1" column="1" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblCTime2</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string><CITY 2 TIME></string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget row="0" column="1" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblCTime1</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string><CITY 1 TIME></string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget row="2" column="0" > + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdCity3</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>focusPolicy</name> + <enum>TabFocus</enum> + </property> + <property stdset="1"> + <name>text</name> + <string><location 3></string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget row="1" column="3" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblCTime8</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string><CITY 5 TIME></string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget row="0" column="0" > + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdCity1</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>focusPolicy</name> + <enum>TabFocus</enum> + </property> + <property stdset="1"> + <name>text</name> + <string><location 1></string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget row="0" column="3" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblCTime7</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string><CITY 3 TIME></string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget row="3" column="1" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblCTime4</cstring> + </property> + <property stdset="1"> + <name>font</name> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string><CITY 4 TIME></string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget row="4" column="0" > + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdCity5</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>focusPolicy</name> + <enum>TabFocus</enum> + </property> + <property stdset="1"> + <name>text</name> + <string><location 5></string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget row="2" column="1" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblCTime3</cstring> + </property> + <property stdset="1"> + <name>font</name> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property stdset="1"> + <name>text</name> + <string><CITY 3 TIME></string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + </widget> + <widget row="2" column="2" > + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdCity9</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>font</name> + <font> + <bold>1</bold> + </font> + </property> + <property stdset="1"> + <name>focusPolicy</name> + <enum>TabFocus</enum> + </property> + <property stdset="1"> + <name>text</name> + <string><location 6></string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + </vbox> +</widget> +<customwidgets> + <customwidget> + <class>ZoneMap</class> + <header location="local">zonemap.h</header> + <sizehint> + <width>200</width> + <height>400</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>7</hordata> + <verdata>7</verdata> + </sizepolicy> + <pixmap>image0</pixmap> + <signal>signalTz(const QString &, const QString &)</signal> + <slot access="public">slotIllum(bool)</slot> + <slot access="public">slotZoom(bool)</slot> + </customwidget> +</customwidgets> +<images> + <image> + <name>image0</name> + <data format="XPM.GZ" length="197524">789cc4bdd772e34ab6ae7bbf9ea263e16ec5096c7973712e442f2fca5066c7be8025e8404f82da2f7f3273fcff20c45255cd9ea64f7760b23e024c9fc36526f4bffee75f6f0fb7fffa9ffff55ff345b0e845ff8ab260f6afff8997a3d1e67fff9ffff7fffed77f1fededfdebc05e07e707ff3af8efffe7bffe3b4aff15fdcbdb33ffdb3fb39c2ec887fb96e3087cb4bf67793c201f9c5b0e1ec1677bee7ed822cbf3c944d9a53f69930fdcfda8098ee4f7d991b27b3ede9025bd75872cf9373fc887529e27e1fd3d492f682bbbf4bc2a59ca138cc9529ec903f9c8d57fd8051fa17e4db2fcdeab91e5f7f1a7b22b4f780d46fbaca660d47790081fa0bc9f6764f9fde6068cfc0728cf01d2f39ec892ffec108cf4d7f8fde19eb45f9a3b36bd23fddbe8928f02777f4e3e76e363d604b33e9760f4e7ea992cf7177b64e98f690f8cfecb1764793e2f844dfd5c7af33159ee8ff03cebbb7e5576cf0f62b294675903a3feab1659f29f3c29bbe73f376469bfd695f021c6c700ed7188feaef7c128cf12e53f42ffad0330faabf96ed98eb63475edb10023bff12959fa231b9065fccd2ac21c0fe10559da773e25cbf3f13518e3d1e3efcf24fd8b5b30f20f5fc8727f3e5496fc9ec952fe7e57f810e5f944fdd83e9f8764493fe7f3ecaf09599eaf8ec892de2a07a3bffaa9f011e6e7ba0d46fbe7efca2ebd9a3c6f66c3e9a14b9f7c24e37b5a05637c0613b2dccfdec1189fe32159daa7be4796f6a8497f9af122ed9f57c018bffd108cfa0d911feb37dd234bfdfad764997f952559f29b838fd0fee34730e64f2f26a3fd5fc148bf3e5696fe43fb1c433e3402f0b1b46ffd982cf7ab48eff85ceea72e3d333ad1bec3028cf64c783f121e84e41357bfe041f810fd9be56469efe0932ceddb7c261fbbf4ba2bb2b44fbc00531eef9125bde246d9d5bf9290a5bd7bfb60c8d3f4912cbfcf3764298fd75076e5194dc9529ee0058cf65f307d8ca7f5a9b28cff0959d25f5f90a57cc5bb30e743109025bd694bd9a5d778214b79d2148cf1d9bb214bf93fd11f47d0df692c7c8cfc8673f0b1ccdf06ca777c8ef183f63f8ee57ed7c97f636ea03d920e18f5a92f850fa17fa615b28c8f469f7c1abaf6be071f49fb2443b28c87ca2df9c4716345167910cfc1d45763b2b4d7724096f4e76f6429afa7bf97fc965764296ff64a96fa2e593ef46fb343c6f8699225fdd654d9a5df3f163ec2fc5c4cc8f2fbe593b28c3f94ef08f65ad12523ff6bb2fcbef1a42cf9dd90a53eb31a18f2ba774686feb852167db422cb78acf695657cdf9225bf794696fa2f781ff269b8244b7a9348d9ddaf2664496f21f3e99ce375ec298bbc8cc892deb04686bd575576e9e523f031e4694a96df8f7df039e4d70559ee2f36e018f213e3e9e45ce475712e7cba0ff93d134e53e1aeebbfc3fd038c87e642f8d09820aeff7a60f457f3802ce33d3922cb78ec6560b47fccdf9fc9fc5adc81393f6365994f73b2e4e7cd94ddfdc93359f2ef2564c97fd817e678adf864c9ef739f8cf46a60c86faf4e467b5c9131ff3c30c65fda5076fd9f1d93213f06ca529e53b294273d5076f7eb73b2d4a7f108e6780dc892df22254b7e41ae2cf9b13e68ef0998e377345376e9ad33b2a47fd1274bfa953d6599cf9a1ef41bea67c6b3fbfdac4796f45a3764c8939c8cfe417b1f9fcbfd469b2ced93a3fec7b1a47f714686be8dc852de02e3f3641ff3e95d599eef8031ffe647cad21e0f60e89f5ea82cfaa94ac6fc7d5376bfaf3f81313febe7caeef7eb3a19f6d38bf0e9bedc1fd7c89087b7c2692adc75f2ffd0e803990ff501f9cccdb7f10959c653510163fe345265f7bcbf20cbfcf77365b93f23c31e92f960f403f469a6ecfaabda214b7ed95059d28bc8925ffd5159f4f10359f28b0a30f489774896fc2f5acaee7e5127e3f70918f3353a26cbf84a3fc992defc4359c6fb9c2cf52998df9994bfb55076e59f0664c827b60fe667d6274bfee303b2e4df3f54167b94e9a1ff9257b2a4df45ff72be365f9545de5d9165be6dfaca222f5ec8927f0fe5e1fc1d256449ef624096f2ccf6c0e7f2fca64186ffd2264bfea39ab2f4e70519f56f29bbfb338c17cefff11d19f6fc5059fcaf902cf9d76e94c51eec90e10f15cae24fe8f3529e96a687f120f3f99cf265305576f90f32b2e43fa82b4b7f60bc51fe2c7d65b117f97bd80353f4c709da735e5116fb84e9419e64ca529e19fad7c813493f06c3de6ebd9111af5a2b8b3cc4f3690a7b2d22c37eba5096fafb64296fd821cb78f5ddf83b52fded4f8439ff570559eed7d760d81f9b800cf9b15276bfafb7c9f2fb0519f3797c44167994be9191de81b2cce70bf2f991931f6764497f7d09c67cee75c9327e8a3b65773f9c9325bd6241867f5711e67c0d2e94c53ea99125fd68ac2cfed63359d20b1be063e98ff11919f6415559e6db3b19f6fa8c2ced5f63798e215fd17f9cdff3736597de8af9637e7fde288b7ec778e07ccde7ca321f3d32cadb5196f938254bfae395b2d8a34b61ced7a44f96fcb25365f77ce09125bfe158d9ddaf1d91211f6aca521ffe1ef2334dc892dfa2af2cf2e8810c7ffc4559ee0fc8925f88f63b813f508c945d7e454496fcaa17caa2efeec8925fb65096faf5c0901f0b65941ff99fa23d1b7764dc477a942721ef439ed53d32e4f3abb2f8bf28ff29ecab75830cfbee130c79d77a5516fbeb830cf98cf97c06f9d728c8682ff4ff19e4dde6168cf6ad67c2947f2b9f0cfff3932ce51b6dc8323f2ea4fd02da0fdd3e18fabc9b9345fea4cf64f8fb32bf8263d853e92b599e8ffbca4e5ec55db2c897fe800c797a0fc678eb0f95c57e3b204b7e8b4765977ed5274bfaa9fe5ed2ff9c81319e3653b2cc0faf45467d06ca2efda5fe5eeab7395476f7d72cffb9e41fb3bc9017930a59eab79a298bfdb221cb7caa9c2bcbfcd7fb90779a3ee2455764c86bf417e5c5c5882ce9e72d65d13f7db2a49f2f955dfa952332ec79948ff2242ec8f0bfb62cf3774e96fc070fca62efb13ce8df55872cf569be80212f862bb2e4d77d55167d744b96fc96e7caa20ff5bee4d7bf5276f59b37c0e8afe05559d23f25e3f7b7caeef7b9d80701e55174a1ecda6b724b863d365616fdb44f86bff948867fd3204bfe6106a67df44696fc860b32fcdd2332c6c7842ce94f1230fcc70ad3873c9f9c9225bdd93119f67b0886bcfb8cc9f2fce6832ccf17d7c26768af39e6f319e4f30afd734679ef7e7f7c40f9d198828fcf23371e7db2dccfc660daef2119f264a0ecfa2f699065be2f4e9445deec9131df47ca2eff5a420edcfd614e86fd47c6fc4eeec8884f0dc9927f559f477e3159d2abd684399fd73919f6e4922ce9559e9445be8dc958bfcbc098bf69932ce363b165e94ffe1ef3f7f34859f2bf2023ff4f32e2f57530e6737caa2cfaf78d0cf91129cbf89990a1bf9ec9925f7eaf2cf26c4396f66c0dc8909f7c1ef37fd65296f9f94e86bd7ba52cfe34f3877c182d955dfe337d5ecab7667ba07f9be764f4475ff814f27c3e5296fe3921233e9829cb7c5f91a53cd33765579ecd0359daa77946c6fa1fc623e547af4586bc3f5716793f204b79aa7a1ff36f4996f2788fcae26f8dc9982f183fb4b7364b65f15f5ec9529eda87b2e85f9607e3e7e25459fab34746fbec2b4b7bd4c9d23e39e637e5d9f89a8c78c6bdb2c4ff597e8c9751ac2ce3fb4098f65f744b467b42be511e7ebe29cbfa668d2ce5a956c8529efc058cf6fa44f9cf604fafe764c8f38ef039ca5393f632f64de0e45b3d25433fdf8363699f2823cb785ee8fde8d8f11319f25bca63ec0bf89ff7ca2ebfe69a2cf2343e2363bded018cf157dc92a53fd71365917715b2ccbfd11559f2af8d94459ec764c9bf182bbbfb594a0e63371ffb64c427f7c1187f714886bdc1fa425e5d44cae2efcfc952beea89b2cb7f7c48c6fa47074cff735f59fc4fb60fe4d35cef4b79c6ac1fe453b05696fb6c4ff4efe7b5b22bcfe0890cf92ee353ed99784286fddd264b79962365975fff8e2ce5496e95ddfd6e932ce5493e955d79d26b32fae3088cf991f9ca323f981fe4d7aaa22cf6679d2ce51d9e2a4b79591f8eaf1b65b11f94a5bcf90319f27e09c67cdd4464c46753b2946f5a288bfed7df637dca53167dccfc31ded62d6577bfc7fad35ec17ca33c9b4ec9f0ff1f9525fec1f6c4f80ab62cfa86ed83f155cf95a57d1a64699f19cb83f19443bea8bfac0cfd744c96fe1d0764c47b06cae27fbd91a5bc83a5b22bcf28224b799ba8ff19e3057b64c85b5f59f4cb0119f6f5bbb2c4933664c9af1882195f6d91e11f27cad2dfb764d8479fcaa27faa60f4d76757f81cf37189fccf519f02f3f71cfaa1e1daeb44edcd2e98f6e5a2410e45debf2b3b79d8d4fb22ffe77a1ff27f0386bc5d4ec990f7e7caeefea24a96fc92bab2cb2f5c9325bfe69db2bbefcfc918df2330edfd0765d1ff4db28cc75eaaeccab362f961efa7beb2bbef6bfa689f58d99567119151de7d65773fbe27c39f617a984f9f4f64297ff74c59e2032159ca3f59288bbfc4f689a5fcd3a6b2e8fb822ce5f79f9545dfb1bd313ee24361cafbfa0319f18c2a19f19696b2f85f4f64e89f4259ea9392a53e5e57d995b7abbf97fa7c2e94dd7d2f21c3be45ff51be476b32ca575516f9f84a96f279c7ca222ff479f817a9b2cb3fbf234bf95667caee7e634c96f6f65664ec8f63f930ffb31e19fe4740863dbb5176e50b876429ffa0adecee5fccc9d0efbeb22b5fa2e9617ebe91111f3c01435f041d32f4c54059fc17f61ff4457aa5ecca93bd90a5bcfd4cd9dd1f3c92115fbc57167b44d3837db4274cfd30ed92a57c9b2b65f11feec8586f4d94653c7e92a1ef7d6569cf942ce51b5c2bcb789890614fe760fa5727ca629f0fc8f0f72265f1173a64e8ff6b65d1bf0b32e2bbb7caee7eed812ce56d7864d827187fd43f459f8cf5ea6b65f13f0332e27b4365591fbb20c3bf7a22a3bfa03fce389e6232f469ae2cfaac49867ff9ac2cfe25db13e3677a4f46fb63fe9d233e57bf5116fb4b19ebc785b2dc0fc9d0b71565b137347dac5723ff73ee4f6992e14f8e94459e7e92b11f0aed7f8ef8dc6c4ac6fafe868c78df5259ec872119e31ff2ec1ceddd833c08b85e74a5eceeb7d0bee101f6fbc87c54ff6e5113a63db0e890e10fd6c1d0dff1982cf7fd776577bfd620c7723f234b7e5e0f0c79b578258bbcaa2e94453f4fc9d06f89b2d80b2959cae3dd2acbfd980c7fb405863caa9d28bbfca29c2ce5f1c7ca529e908cf204ca2ebf19eb0f7fba3e5596f27864acf748ffa8ffe46564ac1ff7945dfed543b2946f73a12cfee63119e57b50167baf4a46ff0dc9529ecd040c79345c9361bf7c288b7c8dc9b05f96caa28f4ec852de40ef4b79bb7a1ffa342263bfff080cf914337fe8c7d99bb294e7920cfb63a9ecf26bb17e186f599d2cf9a70519fdc3f683fc5a35c9588fd9b2c42f72b2946fd85396f5b657b2942f7c5276e59b6dc852bee64c59eca30519f6bed8dfea1fcd2e9545ffde93e14f46cae26f1e92a19f17ca2ebf8b0a59ca53cb9525bed225a3bf8ec0908fd1a1b2c8bb3732f6ef1c288b3f3423233eeb298b3ed0fbd0e70365f1cf347da9cf455d59e2452c2fc6e3469f97f95163fbd19e9b83e9df2764ac575d90a5bc514b59eccd2119f37bad2ce395fd87f1ba0a945d79e737649407e353f52dfb13e3336a90113f4a95c53ede90a53c134f59f4ef0719f379cbae3c9fec2fea0f945ff5e9a9b2ec476b91a53ce38eb28ccf828cf97ca32cf6c73559ca9355c8680ff417f5ef608f8cf5d40365b1770ec9d81f74a22cf615cb8bf17571ac2cf18f902cf9afd0bed4e7d11d19fb95efc9386f72a82cf1a39c2ce5b9785196f6d907237ebd7e57167b93ed037b6b33579678d83319e977c9904f6db2d46782f60c604f557232f253c6fa41a12cf61dc67710c03e86fe0b12c4cbf07c7880fdbc536591aff764ec97417b8427d80fff41c67905e8b33080bd83f998a6287f4c867de6c6ffe9e1c939ec932e19f6491f0cf9bb08c9d0a797caa2cf0764d84bcf64a4df23c35e06535f0f876449af1f90613fe87d496f9190b17f6209867cebc664493fb9244bf9c38db2d87b6f64c92fce94a57e1764d807cc1fe3b3fa4286ff14288bbc5d93a53dbb756589ff3e91a17f3d6597fff2992ce54b6764ec4f5980195f7953167f7a4c96f275dbca22cf5a64295f63a62ce55b91a57c9f7bcaae7c05cb87fecf3a64d89b5361eadfc140d9956ff242c6faf1908c78cf4859e26f0bb29467d55676e519b6c8b05fd0fed4a7d14a59ec910a19f6c93b59cab33c5596f1744396f2f59764ec1fac8121efd6a9b2c4ef1b64d8733332f4e389b2c4cfcec9d08fb1b22bcf94e5c3f81a4f95a5ff8ec8d8dfcefb5c0f7e24637f7ca82ceb056332faef4c59e21f4f6429df66a62cf67a44863d3750967852872ce59ba17ef4579b2b32ca1b92117fd1e7a57cabb5b2bbdfa893d19ffbca127fd1f4a57cad3bb28ca7cd1319faf6100c7d9ab6c988cfaf95453eb4c8d03737ca626f7864d89f97ca62affb64c4e34ec9523eaf20437fb13e187f514d59f407eb8ff1377a5616fbe89e8cfd1d81b2c48b347dc49bc9184f3dd61fe36978a22ce399e9613c5d1c294b7c654cc678bf264bfdd790bfd4c7618f8c784b5759f4ed862ce5697acae2dfbd93610f1e80113fc823b2e8dbf05e59e26f2959f2af79ca627f3c90913fe445007d1db23eb017ea1d65b127987e80fd627c1ef6c46245c6f9bdb5b2d8eb4f649407cc78c8649f8cdf1f2bcb7ada1159f2af8f94253e73053e91f84bf4a82ce59b91b15fada52cfdf349463c13fd4f7b66caf2a27d366b6591a7e88f10edf13927e3f92365292fca43fb68b626a3fe736529ff1119e759dfc9d89f25fa23a43d525d81313fbb1118fa7cea93e3c4c98f7732d6a32760c8c7e48a2cfaae3b5276e97d5e92612f1d2abbfbf92d59d21fa1bcf46f932659e657724d96fcf20b6597dee88d2cf9452764e8bf1c0cf9d57f2763fde94559e46f9f2cf9d526ca22dfeec892fee0030c79145f91213ff53eecaf4f32e21d7a5ff2afec9325ffca48d9e53f1892a5be3dd61ffdf5790c867c4b2fc9224f6a2fcaa24ff7c858ffdf90b15e31509678c7940cff3c224b793ed97ee8df3eea437f336f90a53cd1a5b2ec975892a5fd46afca92ff2959ca57a9298bfed6f4a4fd96b7cad27ee764d8631918f2721393b1be169011df4895c55e9c93b1feaee94979d75532ecc7576529ef1119e57d274bf95a981fd4876bd617fab03f5196fd1d2f64294fe54e59daef8c8c78cbb3b294674496f6aa0ec9d84fd003733fdfa7b2aca7b0bda06f972b65991f6c0feee7f395459f2fc88817bd2bcbfce4f8c1785ced91e17f883c0da98fb31332ec812619eb67a7caa2ef5764f82f1d6569df828cfd455565579e4d9d0cffe58a0c79fa00c6781b3595257ed423633dea52d9e51f307d8cc7eabbb2b41febcf785b9b8cf982f6a57e5f1c92717e305796f274c9d89fb2a72cf613db23c07eff9ab2ec77c07ca63dd08a94c59e66fd12e8f389b2c4abf43eec43d63fc17ed567658917a1feb4278a1519f652a42cf65448c679af4765193ff764d88f7a1ff14f8c2fda13cb5059c6db822ce90f67caa2cfafc992fe04ed4bfb6271a92cf649858cf35dac1ffa6780fe547b03f23742fd2ece95a57d30de687f4c4664d84797ca62afdd91b1bfb950167b668f8cf5cb6332cedb7e2a4bfbb9fe3e53ffba9b91451ed6bb6489b75c3c91b11f810cfd3cf5c8a28fba21599eaff03ee45da28c78cc4cd9a5179d9325bdea3559ca130764c4936a60c8abfa1919f6c64859fc65a60f7baaea298b7edd274bfe69870c799708533ff61fc9b02fce95451f55c888575495653dea842cf6daf2958cfddea81ff561ff4959e2c3fb64913fd3908cfaeb7dc44fcec8883765ca2eff16eb87fe5cadc838bf3805433f161f64ec7f7c54167b88e5817eecce945d7946ef64c8cb0b65590f5a90a5bc9b336529ef2559cadbd4fca43d9b5db28c9f44d387bd8ef940fd387f5496fd552d32eccb95b2e8f70d19e729f69565ff04db8bf6fb5ad995af32264bf9f32119fb95303ea84fa31919ef0b682bcbfee63a19fb93de95c59eb923e33cdab1b2b4f72d19feb6de97fa046f64c41bd01fd4a70b8f2ce5aba4ca128fec93a57cbda1b2c41f3ec958efa892d1be15b2e43fc6f8537dd9571679774d86fe3a5616ff7f8f8cf8edadb2c45f3232e2e1e84feacf755f59e4fb920cfd79ab2cf67641c67993a6b2c48bd89f09f6678d9565bf00ca437db9689161ff7595c55ef8244b7ed32b6577bf35244b7ef51e18fa74fe42c67ac4a3b2c4173664bc2fe34c59e60fd33f813e823ca53e0d4ec8d0a735b23cbf84bc0fd19e4bd4274279466d32f6933d83a18f43c803f5e7bb64f847556589c7f5c9189f0fca325e3ec838cf2eed13aafebb2763ff68050c7934fd24239eb80786bc985c9325bd7a5559f4d3922cf26c7d424e4edcfc1f91b19e83f4e9df855332fc8f2519eb0d2f64c97f38529678c30759e217b52a3911be22a7ae3cb34459e4ed06ccf59a1a19f6c85859f67ff2f7d057515f59f6e3a464e8eb9eb2bb9f9c92a5bd86976429af7744c67ac51c0c7d54c4ca529e0e59cad31c298bbfabf7a53cb5736559dff2c8529e4a43d995a7d1244bf93e5764ec7760ff41fff4d85fd03fb3bab2d85b8764296f7fa62cfa4759cadb8a95ddfdc60159ca9b56c8d84f89fea0fe594564c4132664eccfc9c8b0bf1e94255e35234b79066fcad27e4db29467d35176ed35d1f2c05e5980a18fb203658937b4c988d7acc8d2bec323b2947f744d46f93f95653d8ce5c378ac687e684fd617e3b1b1afecca3ff4c868df4730f455fd990cfdd4204bff8fee9425fea58cf973ad2cf3794896fc830118faa9c6e7a18f2a5b96f4efc9583fa92b4b7f633c515ff54664e8837b65f127dfc9d87f7345c67ee99c2ce51fa3bda97ffa1764e88f076549ff8c8cfa1c2bbbfc8a13b2e47781fe08e97fd7c958afd823e37c18fa23843d50f92043ffb7c9586f785396f39fac2fdabb1991218fd03ff427375d32f66ff860e8c7f10519fb1f301e23d46701a67f99e764ec9f8994657f6e8f0cfb527f2fe5dfbc90e1ffb9fadad747897ebaa881795e600286fe5a56c988272f858d7e71f7c385b21baf714e167d130d94455e3e80313f9367b2ccbfd92759d2f7af945dfad1902ce98785b2e8d77d30f48577a02ce397cf435f5c74c8220faafa7b294f375176f9872bb2942f592abbfb498d2ce5f38f94c55f6d81a10f821959e45372ae2ce725a664294f76a3ecf21bb0fdd05f4955d9dd9f4fc8529ede4059e2f73d61ea832c214bfb142959cad77f5376e5ebf964f873156597ff6c4ec6783a5276f72ff4f752beee9db2ecef60fe5cffdf23a37c3365d1f7af6429efa8a52cfa2a274b790797caae3c59832ce54d0332e22dac3fe47d764646fbed93b13f235216f9c8fc02295f3653167d744a867de42bbbf2f51ec952bec689b2bb5f1c93e1af9221efc22a59e4c5e79a8cf3496c3fe88b569f2cf5199e2bbbf2663532ec83a6b2bbbfee9211bfca955d79bbecdf04fb0d503eeaa3bcae2cfb0b6ec9d0b73d32e21567ca32dfa76429ffbcab2cfaf6950cfbfa4259ee9f90a5fca33119eb3bbc0ffd56657ed05fe32bb2946ffeaa2cf12a65d80337ca321ef43eda93f99f487922b617e3cf0365b1ff6a64c44bd6ca120f3b224b79aafa7b29cf7aa12cf1408c67fa7f8d0f65d177ec2ffad37d32fcd92b65592fb826c35e867e88d0ffcb0b65d9bf7a4c863e0e94e5fcf7848cfdfb4d65d9bfba0143ff6e86ca52fe3e19f1a71365b10794e1bf613c517f176b32eca95c59e23d900f11ec91568b8cf7e7bc9271de15fd17239e30817c8ae1ef579fc8386f84f68d196f91f112a9bf7a284c7d9d7f9245fe0e07caa24f8760c8cfe61159e4cfea5c59e453950cfdf7aa2ce97960e8d35a850c7dbfafeceefb7532d26b2b8b3db107e67eb71659e647fd5559ec934732f2d3e791df0d19f93595c51f15f91251ff250b32e2e16d65b1074664e477af2cf9adc9c8afaa2cf6d82518fa2cbb5696fc5764e88b86b2ec67f8204bfede5859fced9c8cfc5f94a5be2c2fe441ab20c3bfdf5396fd012c1ff5d781b2e437214b79bac7cae22f866494e74c59fcaf0e18fa69c5e7a99f9acab2dfe3882ce55d2e95657fe22159cabbbc5316ffef930c7bf952d9ddefb3bd1394f75459f623a03d19cf9b1f90b1ffae5096f8cb928cf589b9b2c4d7db64a9cf7aa52cfae2980c7fd65796f8c5882cf5691e2a4b7d1ec8187fbc0ff9b7627d20ffaa4b6589570764c8df2b65a91feb037d37b95776e59fe8efa57e17b1b2d4ef8d8cf17546c67e06f417f561dc5216ff8aed017db80894c5dfd4fb58bfbe5696fdb95532e6c35c59ec2165297fe3990cf983f94efd387e25e3fd0e97ca521e8f0c7f3b5416fb82e5c1f8dfe8efb13f08fd4dfd39fd204b7e6bbd2ff9550ec9f08fb62cfb2f3330f4e3e8932ce98dbbcad25e6332e25f3d30faa772af2cf1ef1919e59982d15e2d9697f18f7765d1efe2bf44d497f30e19f93d90719e0df9c7d0ffb3828cf533cc57ead3cf5b32ec2df44f0c7ba82ff64594c0ffbf70e32b50fff4e2044c7df6a62cf1b15330f493e72b8bbed823e3f73565895fdf0a53ff783764e89f4f65496f49467a1565594fe2efa16f8a07b2a4ef9f9391fe9db2dcdf9091feb5b2e8ef7730e64b75ae2cf91d90a15f5f94653eb13cd427fa3ce2114f64e47fa22cfe78138cf935e07de8871edb03fa21592b8b7ecfc9927ffcac2cfa83f5877e882f9445be5e09539e77f7c9925f912b8b7f3a254b7e595359e2012f64c96fd55596f58f1618f3b15e21633df45059fc697d1ef1990b65a97f4196f2543f94ddfdd12519e313fd45f91ab33e90a7d51e59dabfb2224bfed51919faf851d9e5573d2643ffb6c19097d32159f21bb1bdd0df9b7332ec1fcc4fcacb6843c6f9c36365592fcac09087ab4459d677f6c858ef3927239e3157167d1781210fe757648cd791b2f83ffc3de395a9b2946f46863fda5416ffaf4b867d119271be0cfd4f793a8cc890ff6b65896fed93b1ffef4559f417e415e56db1a72cfbbd1232ec8db1b2e8871b32fcc71365a90fcb03791d85cab2bebd24637de4942ce94d30be13d477b352167fb44146ff4ec028ef27da37c17aea6ca22cebcb4764fcfd12942f813ed9ec29cb7ac30919ed75a92cfa1ded9142ffb4d6643c8ff19b32febca72ce5b923e3f94259ce6f407fa4287f6b45c6f9815730e2d3d35b32fe3e83c817f5dfa63918faacdb50167921e5d9fa471fcae24f8ec0d4378f64c8bb180cf9d0ef9125bd60a12cef733806437ecf07643c3f5596f8a9e82fb5cfe70bb2c8a77ca02cf9f7c9a8cfb1b2c4e7f93ce4e9f2902ccfd72f95a5bc4f60e8c3594a46fdc53e30f61bf69b77c0f87de3168cf13ead29cb7a92de17f93446fb45186fc52119fb839ec9d80f22f233e2fcaf5c2a4bfcae4b86bf93298b3c7e24633d3400637e5d3494259ef64cc6fadb81b2c88353b2e4377b5596785f878cf833c61fe5c3f05659e41bcb8bf69b1f2b8b7cab90e19fde8369ff6f59e2435332d6afdaca12aff3c8927e21f222a27c5a3f2a4bff74c888ffc5caa22f3232fa674dc67903fe9ef1af2e19fec3b5b2accfeaf3925edd5796f640ff50de8581b2f89798cf946f832365799f418b8cfebf27233fa497c2fe8fde9465bd6f4ec6fee64f65592f3b25e3bc39fa93f232ae2bcb7af53e19fe42aa2cf24f19fa6002863e481265492f2323bdaeb2f8276764b4ff81b2c443d0ffdc8fba6279b17ed88f9465fffe1119f1f65365293feb9f227e112bbbfc7c977fa8fec7c5b5b0c68f8ec19047bd3e18f2a1910b53fead6ec0987fb5028cdf77ab60fcfe2211a67c4b6660cce7cd3b19fb39eb60ccc78b1b65896fbe91112f1d9345beae9fc992df300463fc5d0cc9f8fda330e5df305596fd9fd764f8efafcaeef7171f64496fd40363be4ddfc9b09f6332f6bb64ca120f5b90b15fea098cf1b4ba5316fb6a42463ce45059ca7f4f463cc45316ff8df5817fd75a92a11fd0ff31daafd75616f97441c67ee837658917a17d29efd60519e75146ca223fd7649cffa82acbf98a3b32d68b4ec1b43f1f9545df54c8d0370fcad23f3119f27f0ac67caebc9125fde05459ecfd1e19fbb1ae9445ff34c8d21e6bf40fe567f55e59dedf9092b1bff25859eaf342c6786e2a8b7c3922a3bf1f94e57d43283fe5eff45259f6675c91b1df62a32cf6784086fc8d95257eb447c6f95b4d1ff1b90b32c6cb2d18f27b5e5396fdb9af64f8077bcab25eba4f46ff687a58df6b90b1df06f389f27d5c5796fc5ec8d07fe7cae2efb07de88fec2b8b7d3526435f431e51de4f2664e4c7f240be47efca72ff838cf63e5496f1c7f2a788e70ac711e39b4365d9ff7749867d2af339a63c5bde80299f0fc890574d65777ff506467d9b9f60c63f5b64e9efc65a59e2070119fbb9a5ff63ceefd6b5b27bbefe4e86be40f939df7b8764bc6fa0a62ce393bfc77c0f3e9465bd81f9a13f93900cfd9028cb7e822519f18a3365d99f7744c6fa06f3c37c1fbf90b15e992abbf4c30732ecff3b65912fc764d88387ca32dffb64c97f8efae8fc1e2acb78f3c888173c28cbfac0868cfd3b6fcab2bfbf43c6fb5c3f94c5fffa24a33d301e39bf477bca32bf591eaee71e298b3dfb4ac679923b65699f2619fb4fd17f9cefeb3332ecd985b2ccf76b32f23f5096fe6179e99f1d2a8b7ed1fcb05e3f5096f9c3e7290f9ec990070fcad21ea76494c75716fd5090616f1f29cbfc70f2263ae6fccef6c8886f2fc15c9fb8204b7ff5de95c51eab90b1df2116e6fc9df494a5ff03b2a4378d94451e0cc9581f6e80d19fa33e19fee84259ca7b4e96f427beb2ccef2b32f68f7964f1e7d72c2fd79bf6c9381f74a62cf6c82919efa3fb501679552763fee5ca623f56c9a8ef1d18f3bffa4c863ceb284b7b303fceff1b65b127597ff45ff75659da9bf9a3ff5a1b61cefff999b29ccfb926a33dce95ddfdf49e0c7998294b7d4332f4c99665fdf4968cf5842618f33d7c27431e1f2bcb7c4fc992ffa0a22cfdff46c67ac6a5b29c37780463fe8f3fc9b02fce9565be55c9781f40a42cf2e9858cf6385196f1caf6c2f898b0be900715961ff2205b298bbce89011fff695a53d6ec8789fe299b2ecbfda27e37ca1e417737ef79ec988ef4b7faafebdb820cbfd6943d9f963cd4730da7bd95096fd767b64aca754c9f03f6fc068cfde0719f1a1aeb2f81be764f4e71919fb078ec1982fab0765b1cf9b64d82327ca22ef7c32e6abf4b7eabfa84296f47b47ca22ff9ec8d82ff2a02cfaba4d46fbf5c890cf0760cc87fc9c0cfbfa912cf94febcad29f5764ecbf5c2b4bf9fa64ac27697ef0f7311e38ded7e7ca220f7332ea5f5796f68bc992ff67a62cf547fb6a7c6345c6f9b6b5b2ccbf4f32fcd389b2d82b1764f4f74059fcff1a59ca131c294bbcd1b57f6cf585f4c70d19f6f30318e36bbd1166ffc62b30fae3d32323fed026e37c46138cf6a89e91a15ff7c1a8efec4959d68f5ec9902f7a1fe7a39cbeb2e623f6433bf994a687fc7b9e9f60fc7dd3e61e187f8f74b60fc6df0f1c8f848ff0f7bfa32e19f1a04730d2db8460a417d6c1fcfba4488f7f0f6c81f2f17d7bfe1318f12cff5698ef93497c30d7af4fc17c5f5f00e679af8130cf6b072b30cfef1e81f1fb10e5e37efb654f98efdb0a2764a43707f3fd8f4b30de2fe577c8c88fcfe37d157e838cfaa27c5c5f096330deb73454c6fb8f3c6549af20a33f5ac2f407ab684fae0f143561c6bfd2088cf1df457d192faaa0fc317e1fdf0827905f33b427fdb5f1828cf5894732f46548c678dc80217f669eb2c4bbe664e8ff0b32e2917760f85ba34765c97f4896f4c3b6b2f837ef64a43f23a3fe180ff4afe6cfca12ef0fc888f79f298b3dd725239e74a32ce5fb20c3de7c21633f08fa93fed3e4848cfd4b67ca223f4fc9a8ef87b2d4f7958cfa56c9e8ff6b30fca7f14c59fc15e647ffe95859f425db03fd19be294b7ca34d86be3f2763fc62bef3efd7171764fcfdda3365f73ef5b94796f76fad3f94e5fd59cc0fef97984c95e57d1b0519e77f626589e73f91b17ea0f7f17e943b32fc3bcd0fef676a90d15e27ca62ff1e92a1efc6caee7e5c234b7bb5176469aff6c2f7cc15fcc39f21ae089ff6fbd85c49e9b9f89bdfa5f87ef7332971b7f43d7f97949e0b713fc3bf7b7edf1f80839df492d2efbf2b97fdfdb0549fd1ceef83d2bddd72ecd637ff4d7b8d4b57f84dfdbd523ebf6affdd76297f4e7ed35f7f24fdf137ed1deee4bf5bff292ef79c3f73cfcd7ff1fc3f3d3eede7e2bbfc9d8e5cfa2b7f6dae7feeb370d7c6fcfbd3bf3057612eb95fc1fddde7d7ee372bbf8aefed674d9fdf5ef6fbbadf70df37bffc5eeed7c072bfe1b75c190affd27dd7f8925605d715d2bb362db4c13337e6f3c6a56feb51987f4b7d58cea596bfd06bb9736f7b15a61cf6f7b7fe1d9e633ae5fadb72dee3b35cc6efdae177fd50be6a680f9bcf9de98f1fdb7fa5e5bfff52aeef3e0bedcf8abfedcffb9dfefbd5657fffe09e6ffce4996d7b7efff9d7c66745fb93fdf1257fe891ca7fe86a62ced6c0b5d2bfffc8f5b367af77f2a8eedcaf969ebb0657f16c7327fd72d9da25661e6d5cfcee71a75cb5f61faf57f0933afebbd75fe913ef37f9fed17ef9ee77fcf76e7fec3ecb3e68fe0df5f92bd777fd51717a84f3ff9fba6aa57f37fda7bf31ed0232a0e1744913df55dd2532ac82cfaa2f7aa6897f3f9b675ebe2927afb6fbae81ef1b861bf8ae70f71ffd8eff6a3edfcc67ed17e97cdf1e52eea5b131a8e37ef6fb1af2fff1bb5fe7f1abab59fab72dc3aff3fe23fddbf8f2ecee6fd91f3faba7fd77fab78d893f333e7fd91fd0237f4676fdd9ebfd1f9493d4212fedadae28eb107e36db5f75c9ae6c2beb865a296d7bb54bdf7ffc442efe4e27f07ef69be7fe48fdff6c3f5066277f639a3f6b8bea6f2eb66dadbdd5ddffc9eb97fdf11fd32394174d3ffed3f2ef67d79e91637bf02f6efcd50f3a64cf5f397bd97eb69ddc6f38b9b5814ff1639a0dc89595bfef6ceb95b3af37ed057c11eb03d9fc3a4eb7ecca5dfa5fbb32767b15f88c55a6ffba3d98def6f3cfb4ffae6e123dd22b95f7df4bf7bbfeddcd8f3e5455afe287ebab1ef9b1bd7e97f7dfa147e492fed8c9ff3fa447ca7333fe66feeecaca5fc9e3b2cce17560ae433cfbf84dde1fa5ebed9b72354b97956b47f83c36d789b94ecd75d6deea277e5fd6477f468fa43fa9ff77bfffbb64fd6e9af1df90f6aecefe553b7ca747fea89cff27dae067fdf1558f70eefc539fb4e1a94776e76a59e6574abf235316d397a8224d2bdbcffdc2f3cde57981177a91177b89979acf2eaecc5c3dbfebf5bd813734cf8ddcf32b3f94dfbadfe7a56bdc5e78137fe54dbd9937f716ded25b796baff0367ec3fbf42ebc8a57f56a5edd6b784df3df9677e95d79c67af3c6b0b96d393f4d3a37285fb5549ff225df79dfd67fb71dfeeae7aff4c89ee98fea5f4c9ffaa11c8b2cc7debeaf7bd94f6c78b7ae8f79fd7a7cfcddedb4db1fdfeb91ff44ccc0cadc6bccd51afe6d3f1f71bf1c43aa959ea7bfc0989491dfde9db94c3adebdf7e099df798fde93f76c3e8d9cf73ae67a3597d1179ef17d3ca33bbc3d73ed9bcbe81bcfe81bcfe8096f692ea30f3c9b9ed1139ed113de797b11f8e6f2822008cd67642e23670363b30726bfa06b2e63b3063d73f5cd3530d730180579300e269089a68cc1d45c3329abd6f3bbeb3b195e29d5b91c437bdcf9aeec5ffdaeed77f32dfb54ec8f721ffd913477cb5bee2ffebb9cd775a9dcd7edaf7dfb3bbdb0fb1c7ffff8cdbd3f73edf6c7171de3f4c83fa943c4de6e409758fbddf3afcdbfad1ddfb69fc1dc7f7431a9225848ecc87c16fabb1b534a895d17c1325805eba00836c16770115402332203634706c637081ae6dfa6b5825670195c994f3b52cd6f83dbe02eb80f1e8276f0183c05cfc14bd0098c7f11bc066f819941819941819941c17e701098d91398d91398991398d11d9899139899139899139a99137ae60ac2308cc2384c82bbd08caeb01b6661cf2fc27e380887e128ccbdbb701c4ec2a9df0967de4338f77fee13548c0ca74d5c928da6fe2bdb53a1fdb4b2f9daef04263d7f6dbe3333db5fba36e9189f6865effd2159fa35dfad5e5ea20c4d97966977d31f6dedb7af9f3f4bbf8998a2ad832de3ca94ef0e7aaa5daabfa953b030e98b0e93b860536c8c70fd93b2d65cb9b6e5603bd577e28c7f872eb1fdf18ddefb0fe991b2dd9795e40bf548bbf4ec6be99e19e96161ae4df8195e984f3b72cccc086b613d34b3226c86adf032bc0aed7337e16d68f44b786fae0773b545ee8726fdf0297c0e5fc24e68d20e8d7e09cdec08cdec08cdec088d7e098d7e09cd0c09cd0c098f65768566968466968467f8343325f2f1bc2ff723336ba2c05c46e74446e744460e4549308ad2a81bd97abefc42265386574a6dc38bb19e13a461ca1419dd15f5457f064bd155d4597fa8fd77ffbdeb8f40fe078bf6575df22b7f0097fb4d490f79617bebbb510f3c4a5f6adf7e7cd3f7bf1a3be5f8e39fd1757fa48d921d76ff767ae477f6de5ffdac610d416455ec6228120f6a4403730f32221afa76dda1509961d7246c4bdc44a3288fc6d1249a46b3681e991e89cc288956d13a2afc4eb4893e2333832253a3c8f44a548bea51236a46ade832323a2532694466d447b7d15d646650f410b523db63e7e6f3c9f0737017991e8d3af61eeedb7f9b1915991915bd476d37433ee4d3ce98684f668ad359360f33732233d3a2c3e8283a8e4ea253532fab03ef4b7eca5759bed523cd925c371c4ca3b3e83cf6632f0e82c28be2303a8ea33836e98ee32498c7c6df8abb81e890aaae0bfdaafdbf5e5cfbb1f1b94f5706892d5de39ee885dfa7cb4fd797ed459cc5bdb86fca672cd078e83762bb4ba7093db8b0fd6cbecfdd772ba343cc1808276e969872c463f4fb777a64bb9e23b1cbb69653c6c85f1f9fdbfe28ef65f8cfea9157c80cfb196ce58dde6feec8a2d7d2bfabb8674671b0095bb1b1fb63233b6363efc77373997bb19931b1d1f0b1d1f471116fe24ff37921f22c36e9c46ee698cf9ae8023baaed088f8c3e71b3c4c8b2b86e3e5fe43ba7233ea03b0cc70dcc0c7c67d93dc719637f6f4740cb702e7575656eb77f6e2f7f67ffe25e6446577c692e53ced8b4536c665b7cdb16bd62afa31df9fdefe891529bbbcf698929a37f27dbbf4b9fbec6d894f54e2ea74b76d7aa76d7ab5e7f925e6de7df657d52f647fe2e7db2eb1f7ed523ffa40ed9ca50d109e7f17dfce017b19103b1d119f1139ebb31f2c78c56b73fcaca302bd3f6cdfd67fcfecafcdbb476dcf18ee3d7f82d7e8f3fe2bd783f3e880f633362e2e3f8c4ea97f834fef0baf1997f629e3f4ffcc4f35749e0744b3b31332689e40a5a32e2a3a7244e9292ee30233f31d64cd28585e59bef5f4497b819f581d9716ad8e89c24333ae8499e4d7a493f1924c3c4ca4f2b23696fffce1fd9b58fcd8c48f23848c6c9246c25d36416cc93b95f24a67ec912a3b12d723ebef8c3edbf2b9b1bceff58fa17c67790f59f3be7f7358c0fd4713e611b72fa77b1a50fd809f6593b3b6cbb188995185f2a29bc45b289df92cfe422290c9b5197548dff68fcabc4cd2cf12792fa2ff54849af99df583b847e2af7eafdf5f1f9ffb33fa232d5c890c4c8e0c4c882a4158c12c8416b532797edafeb0d8861254696fa47613d319cd8d1736b678af934bd9118cb29b13d62d24e8c4c49ec2ce3da85e5e7e425e924af817dde584d8919ddf6ff8919e9c9de5627b811de9519c04fce06ea0bab2bdc73fba27b924c2c33ea94e440625dc9617264edeee4785be76fe3f1657f64477e3abbddd6d7d42336333c3915bda87e0af5d31fb5cb7f96bf4dc3b6fd19fac0d43335fa35e51eae3f2aa3e95742c7d919929a72a7462aa54622a5463ea7499aa656f20ccdbfe9abedda13df95b5561a43e5d859f527bfffb33a64d73ffc1ad7fa2ece5cf9328fff48eceac7b9f94536fa45da4bfbe9201d867974928e924e9aa7e37412ac8caf318adbde209da6337f1cdfbb98c8951fa7f374911ab999ae8c9c794ed7c9495aa41b634135d3cff4c24be2abb49256fd4e5a4beb69236dc6af693f5ce9da77c7c5cb6c9438f6ee5263a3a597f12cbd4aafd39bf43635dfa7f7f0ba3f4a3ae2cbec303a82b3e4743b2becf7cec27a828e319f96d387b49d3e7a51928b6c8cec0efafa4f657943f5c8fa9bf6bf36f74facae35695066deb876e47356ee769c9efa5d7fec7ecf7d6be7d1287d4a9fd397b4939c4747e96bfa16e5a61f56e9bbff893c7fb65ee16258a64f4d5ba546daa4fbde223df0eae9a1b7f2ced3a3f4383d496d9b9c491bdbd8606aaeae99815dc3ddc05b191ba1e31f3bbdf5d51fd9d52715897bfafbddb01b794137f687c9953f4f9ffc6137f9859efef7d7f1e2efc6ef377aa46cf7bde1bbf29e9ab25dc939cd58f80f73b0bdb5534d6b7553c87ac35d2353ba59b7d735b2b73b08465d2b5fcc68ec8eb6b2b26b6cfbee586493935155db1be63be393748ddceb1a9fa46b7c92ae9131dd6577e59edbcdbfb4aee264d789c8b8aef15dba465e7737a223e8777c99254f72515794f54af7b3e4a79851d23572be5b11d9ff4b3f8097ade377eb23bb6bbff40fcaedcc7581ddb6a77d5f96b52fdb7434ae64f5b8ed0373bf6b7edb35be983b07c3be2eade9741b320ed4f7a96dd3ed9a74bac66aed1a1ba07b25eb523602af31c363699feeb544cebb66b6778d1de0594967fbefaebdd5b3d55299cb3e11cb603f8d54eb3e881dd16d771fa39352993e76ca5cfb26dddd314a3dcf768edb5ff7856ffd9135e6625bd631e2dcad5548bcc9edec40cca9a2f128c6401a883388bde82279760fae6d517cef4683bfea3e759fbbb6553bdd57efc41b74dfa293ae1d6de3ee47f72df1bb7b626f77f74dba77f8cd81b90ecd7766e4778fe3b3ee49f7b47b963c45c7c12a9e76cf333ff3b220bdcac2709245599c257ec3d8b90ddff48edb6765cb7a02996dcbdc7231161b07696476b6165937cb24f21b3d88cea067be9d25e2776c67c856e7d83518f7db7bd149592feb67836ce8cea8883c6afc726dba525a9bd8c66e28ebb76b0e4eca5839eaafb0d7b8e12ec48cd41778f465cde91ab134f96cb8357049af80cfe785b3d8cb46599e56b3b1f5f3cc771da77b4dbf1a5decf6a6651397a6cdcbf88666541b1d60d73f3233ba33239db279b6c896887e7c9422e4e576329f99b1bcb2b58d966445b6c93eb38bac92991198d56c1f58cbcc5f6566cc640d632f98f1923583b9675764efe16bbca1ff96a6dfcc8ccc2efd2233333233ed9fdda0af1f55df75dc5eec57b70e5394da53c681f3afcc3df39d95182ece76adb1d427d74edbbd64653d529643e5f317afa57b8feded5a2fe354bbeb1be57808f58779c6d5ccc88fcc8cfecc8e2633eab276f09499df664fd0d6b6759ecd657bcce89cac93bd2603f3f996bdc7a6b533d30bd99ee880ccf45866466776981d65465665469e64a68732fbbb73b187bfd8abe57a94d67d7ba6777b9eac8b385df1b0f53bbee88ea7af7ac47af77634f44c597a612fea19f993f57b49ef3bffe25736309fdf3d5fc1fb6599d6fe2ad7bfac3197754f796f32ebcb34b0c7acd78dbabd4cf602f47af25cafdfdeeaa0335c94d3d0e3bd81e8f19ed1f93da3777a6684f5c6a5f6faf851e7daef7a66c4f7a6bd59cfe8fc9e91843d33b37aa68f7a6b8939f68ab09e9a51df3333b367f473cfe8e4f4103e18751ad78b6c392a320e740fdd0bcad8de8e4bb76ec431588e2d725da63cde311ee231ee97dbf5edcb7e2dccb7de40e48fd384b6542d27676c9ca9e164999d9f1f7ea357d539d930f2ad83348a2f766fd5fd2eebd564fda257ef357acd5eab67b473ef4a767af4ae7b37bddbde5defbef7d0b33b4b4ccbf51ebd453c882b3d333a7bcff16def257eeb75e249efd5c892ebde5bcfb47eefa3b7d7dbef1df44c6bf68e7ac7bd93de69efac77def7b3671ba3ef5bcfb30af9f1a8b6b52d67a31f98729b1e493fc2513f8cda6ea7c9b5917daf5bffe38b2e29f57a3f4a622b1bed6a623fee27fdb4dfed67e1c8cae37e0feb0ef4397e661f97d74776fd9536e467a5a40faeb1cfb8069dcd337856de5d8713e955e8f526f63534b9d66d65b25da337f5eef7077d33c2fb2323b3ed9af7c69f3b7f67cfc95fd746fd3cadf4c7feaa3fe94ffb6616f5cdc8f6ae4d3b2dfacbfe2a98f7d7a237dd4aeb81c40177a31c655dd237f2babf81d5f5299f56baf43f6535d7b67ddfcc06ab93fa668cf4cdace99bf1d2af9b7218dd62758af57bec67dfd4b3dfea67d98b29df65ffaa7fddbfe9dff6effaf7d151d6747be41a3646978cfc8ed531f1f3ce9eb93db173421701c0de8e6b9c43b47ba0df5c3b6ccf0d192ee911dab727327ffb0fb8da223fdcfac4b4342f2193dcdea469e9f74d99d31a87c1f37d3377fb66c4db1eb271ffc0e88cbebd5e24d6e4ec58e3a3f48d8cee9b91da37b2b26f5bd8b44edfe88fbe1d9176bf9549af7f287aa47fd43fee9b72f44fd1b267e219f6cf07fec0cc9041792da6acfb6adb38c920345734880789f9b4bdfdbcf54fb4d7777c94e04ed659ba9783eec0c8e3be9931835ed4fd72f6e177bae43b7fe43b5f8ecfc29f7292eb4cdac1b6b14ab2a31d7959b2b9a3c136ad415ffcb9c140facdbb6d7fb1fd07a67f0646470c72f135acef30180f2603f3ec6026f27f309791ed2cabce763d4975c8ce6cb1cfd978a08b099674b59d29b61d6dbfb9bd0fc626182ce0e799e70666d60c6c7e66560ecc4c1bd8b298993530f51ed8ba983e1fd4c40f1a98913f30bf1bd83630690f5a251d53dedb56d64b65bb89fe48a9fd9dce3ec47e2db776696dd5f4c32f069783abc1f5e06670ebaf06a607fa937032b81f3c64cfe9f5a0ed1d0f1e074f7d33576d29ac5d6af7c95a39357836cf9b12d9f5816c6aee9bd61bbc7a496c46dde04d2ca4c17bd6e9be8793e062f031580ff606fb83838119f103d3c3836319a5bd23f3db7ba32b52230f8cac1c9c04f3c8f6aaadf9d9e07ce81b7bf469e80d03bf188632ab6c8f0da3616c771f0e13d159c374d81d66c3deb0df3d8ddde8f53bc381e892e1d06fb8fdbfa6d587a361debf1b8e87268fe1d4c8bee71ddd51eef1a7e0ceaea7d81e1ece86f3e162b81cae329bcf7a5804723eb1565aa3fe598ca5ec8fecae236d7d94865848a6bcb69c9fd1d1f062686cf9617558cbb2613d9c78a7de62d8b07d66f71e436fca6f3bd8cb447f7145ff6cd8343afa63d88afb26bdcb7466d7a8ba07b6ff6cbf99ba5c89c4195a6b7433bcb1ed3ebc1dde0def65440f1f86ede1a3e804bbbee45652cf77db6aeb8fb0ed5c5cb0f4bdfd4d706574b8c967f824fe9df30bb1de64a3294353a6e18bfcdbce8aa1e9ebe1abe870f7fc9e3c1b98993e34636cf83efc181a5dd1bb0fdefa2bd36efb224d860732b6ed65748cacd318bf7b68a56d43ee9b761cbab3f5b592ce39f41b3bfe8829cdf04876fad91884b5d3ed7ea4e1b170af2e7b696d69ec5c76a5323264685bd1c882a1a9f5c8b4a2675a6f64e4f8c8fc766446f12832572cf26094c83af928953db9a3ae4406ede7c8b4e2c8d8c7a3bef8155c2b1819993732f26d6466dfc8c8b7d15874dc68329a8e66a3f9c8c89e915d6bb7cf19b9335a4b7ab6dca362b419f6c3ba4dc7e98e725ca814fbeabd8e3623c4aa18cffa4e26bafbbee82e2b6b6d7b8c4c5b8c767db63f1293dff55f76e38ad00f23336247e6bb9169ff5143765adad8d1a829bab55f17d9396ab5b77b8d21235d9de9ef5445f7f01a999935ba1a6dac1f30b4699bdf8d4c3f5bc96875c3c88cbc91f9f7c8cc8ed183c878ab03466decc079927d6edffa21a54bd79c76fc14ee7be3a74bf343dad7e992fdd2beb96399096e5f1dd6abd84fce320e64f6d87eb156e0c8f4c3c8dc1bd9991f8b056fd766ac5d3432e37c64ed95898c2b7b6f647e1bbfc2662aad6975dd1c71b11023ff466fc3d6c8f6b86dfd3dd18a2a1f5eb0f3023bfa46a54f37b20fccdcbd1c1d8e6c8f1ecb9c77dad88e64dbdaa7b29f76647a7774de1b8e9e8379eee75e6e74411ee65118e5719ee4e9609c77f32cefe57d6f959cfbab7c900ea3ab7c387830cf8df2dca6958ff3493e0d27b9d161f95c6654be103d68f79ce6cbec395fc97aba6dbd7c9d17b91905f18b5ff4447e77faa645f34fa75bdc1ed4fc222df24a5e7591e0779165db19b28d6d59fbdb3e637da9dcb4605ef71b79236fda588b3beb58c3fea16a49377cb75eb4eb8f509fd4109b32be9e975b9fca1be466e4e7976295bad1749ac4b63cb92d8319d5f98d8d88983a4d928b78667444eacb7b4e5af96d37f657d696b7fb15864646e677d1517e9f3f74d7f15b7a93bd644f793bb7918b439158f963fe943fe72f79473cedf4d6f4d36bfe96bbba4b8ccaad15591f22dac6f8649c7cf5dbbeec4d285bada54fb79fc1e49f9776feb87d713656d6d9d1e99a8ee91fbb729cc867b90c6eb6bcc8f74e3fd95913cb18756b336696e57bf97e7e2063d4fa55b9a97b6ec66d7e9ccf4783e8e8cb79a0bd2feb23d72287f313d8e5af28356a9397a3a23b570e7bd2ce61ce65b797f60c330d9ad1ed36ef8a5d9b9bb4c7fed81b9bd13ab6bac6c8f971243ecad8d46a9cc8bc1f9bb2d81a0d17928fdb4962eee5fb2203aca535ee8a1c55dd603ec71974a1d167e39ec4bdc67d919fba5716f67a7e3b1e8c87e3d138472ba3bedc9162659a2dbfad979de53d5b56a3cbc613898d7d91dde5787cb5f4fdaffc91b27d5cd2e9e369bcb13bf86d3dacdd3f9e89ac1dcfc56fb2ed6b63855697f54c2f8f6dccc8f4c778d956bfd2ee574bcce7d88ceec0e88ab19199e342f61cd874c71b91c1e34fc860d3dee30bb49bf9ed187edeb826e3a2bc5feda73360f7fa6175f6ebe5f4c7eef3dfc51477d6adf45efbebf7e33a74cf09a4f9a1440e9c0ef2f179b0d54de38648beb11d37769792b9c697f4a99d1eb16bc1c7c62635a98dafc6d7e39b30b6769eec6d2dd9955f6a58fafe4166829b05d7b42bf1bdb1dfb95b707c9bc7e3224dc6a657c766fe8e1f249661479d3d11356e8f1f6d34d1dac256ffd8796fe7b9b598c6b6e6cf18c176b4d8f4ece76b5e1ddbdf4eddb98b8eff61e4e5c0d8999bb43286b7e89eb523676fbc3f3e181f8e8f82f9d8ee14e17edbd6f8647c3a3e1bdb673fa55e3a43ce45f3dbb32256bf4efc8937b17e903d1d7cefd6c20b5ddf30ad6ced5c3b6bac7f3009fd55b2fcc9f98eb23fd246eca92d7b63fd4a30ef9b5eebdd4e221bef91f59ba86d2d9d492c52683c175d674757de99249374d29d642863cf5a1493bef515f355af3919e44fe32bb13cec3a85b5446c3ab61d27c3c9c8f517fad1adf9d8f21f06977938d89be4a343d71f1e2cbcfd926edd9d21dfe9909f7d3e61cf3574c464fc8be7bfe4f1f5775f74bdf97e32810d60eedbfecb758f369e7fd8de57fd732ad7f86132b5d6b3f5bf26b3f071328f8e260bf5474ccf4ecc68cd8c3c9f187933312d39294a73f41732e08b9dfed1fe71addab680193d93cfc9c5c4e6539dd4267599e3d65a703626ce6d4c1ab043fdd2dc3f43cf99cf8919411333c727978885999e9b9834268c55d833ed66c64ccc28b0114a966762f29898993931336ef2108cf4bc3ad61fa27cd2eed911f3d8fe21a6e564911d794f62abdb9892d3453bebce13338327d61a32bab8d7125bd77a84dfae7decfa23dcc3cab508db4bb63caf6d8d01d9a8c6e4cd8e7a911cbaf7f84474c0c4b6f387ac37f57d597718ec61cdfb1db123e8442743f785277bdb76d2fbf67b737f7280f58f7db4cb838cb8727fff6a4ce8f58c586059e697f636a86efa6e9cd9b63ffcfe7bdee3de6b8da361557372d4d6b89a1b0747dfe826db6e76ec99769c9c8a9f6dfdd9891d6fe677a377f7ae56dfef4cbd69303533646a2c99a991315363cd4c53a4465fe414adf4bed511ce5e7cdf99d3bb357d109d31ed4eb3683ded656df1d2b315f63d754446aa6c413af969d47672e045f64345cf62878726bfa037ed4f07dee774181d4d47c1dc9e699fe6e61a1b9e0c5be955300fb013c2eaa1e9d46f4c67c3d674ee776cfcc61ff16c8aefde8fe285d3c57419dc59399b64c8d794636a46e4743d2da6e6997e6ef7ddfa6e5fae7ba760056b45cde9e7f4625a999a5139adc91ea5a99102d346ba9c364be7477ee68f5cfb1db78f016bbcc3cf7c386dd97247ede9655b6247a6d7a7575123b575b91e35eda89f9a724cedec37b3717a37bd8f6e8cdf76ddbbebbf4e1fac8fc23394d1de56d7dbe82bfb523ea7a5fdccd28ff61939cb69f27fa45d602d18ec8d2efb077f4467bcc3aff826d6c534a64f18edfe8ff7b73364e7f71867eea4c3e9f679ab3f5c9460c7af9c1c71dc96c699cdfb59c6d7f465da99bec66fd3b7c1d9d47eff31dd9b6ed2027a04711ecfa43c352d3435f263caf8c1c376aebbb9fab295294e363cff4686d83db2b1ac1859bb797a84124fe49ec6c3fdb6da93b655a6c75b1fc8f90376449c88976acf91db75d8a9add919d67e2193edbaf1d4f6fe93f83d3393eecce89b5910d6273ccbd0dcea107796cf9461164e7b337b96b08328a52fb265168bde98e18c9aee61e685b5e9280f4633538659576279339346daf983fe082fbc8365d64384f344dad77ecefab2463033759f0da57c6c5feba7cc6ccccfea1a339367795bf70ed8116ffd17ee5956d90a9d61a3ae724a602beb13f81d2eff0efafbb9247f9fb63ae00fe9919ff8b1e5516efb7c3696cfefd6eabff821fcbebd538e529a3a6bec787d954f893e976297e6f733330e67c63fcd53ec3fbb9335fcbe797666df49f022eb23c1dcc8b162665a72b6982d474170385b41239f5306e10c1e668df3376cab3dff5e86b8d960e7aa8d5216b3b5fddec5441e3012f6709d62ae97f4508efdb6f6deacb0dab0f7305cd998b7bf1abdf9c3feaa3feecec2d16c9375669f7ec3c670ecfeaed985bfca3e6695998d9af666b5dec5e07e564fd799db371bcc67b69506d005764da365be6bce5a36fee156baacaeb2d1eebdf4313987cee1790a9ecf6ffbb23fd75ed69a5c78c17433bb1c9c798bd915f6122d4b670c7fe68fdc886eb265ef2f8c061cceaec70fdc851fb5ad3799af6637b3dbd9dde8507ca3e07c766f634fd65ab5bacffa0c363a3b7b907fd39f747b92cfd15f7654f8c19d9b254fd415939193d3c62610a9b56d7ff73b9c207067354b52affcdcaffbff2733636706508ffc546794fd90a7d2f7bb7e09d3a66f75007f8efef5f95642b8fba762b9ceda76b5c11f3adfbc62df8fe3d652acbf097f84e7fcac2d3b333a65f62473afbc6f89ba64774df5a7fb744a25b73ac2ca325b2aab0b6c69ad7d3c3072636666dacce43deb94ece1f36d4da9b3acbf327b95f799fc70de9b7124bcdbc4c6c4dc1e2f93dfec4de23c767d99e7aa7f5807c73e9f99f9cdec43f2b3f190d9de6cdfed2f58949ee31edcf2faec6be91ecae1cab59bd72fd647ac1eec87a26bdddb244e4477da585eb496b58cd981b0b37eee6687b9a9e7ec4874c6ec78b4999d88df36434cc7ed12c18850195cf6037cf4c747c926f8101daea3ed05ed6f75d9d93723fcaf5ed023badeb1bbc7e1573aa9a4d3766788f581edeae3ec5c2242737feed9757db7de728ed8d6838cf7818d0f5a3b81fbb55ecb673c759dfd462c977920a74ee761dbc50068eb59af6d901a7533c3cec43bd101aa070eca312d5c28f93c46e9edccf89c4c6d8c649e6445af314fe7dd7916199b7adec37cf7b7739c7e8ff50fec77f3fef4cded566c39d9ecf62ff57bee2c5ae1bfca9af4e0117132bbc6f3ee453d2313b24b2ba3bba7767d55cf2b4f455e58fd29a3dfefcc077e311fce47d68fb196e63c9f8f23b7e30fe7b1edefaeb67b4983a9d3017226aeb4dfcdea88f9c4c5d91aba67b5bce65ed9f147cc6f527f3e9dcfe6732b9dac0f61dbd5591fa62e79c3946be1af86175e61e380b66dec3ad17c395fcdd7f3626e46c3fc737e31afccab56ffcc6ba23be675aea770b41b9d7eb4d501f2b68b69fb4b9f7deccaf3ed2cb3ebea368af2a3eed819c13f7cfeda5fb5d268326e8bae7a6eff38e277d21b718dfde3eb38d3f7e1d815e16534cf0fbaad79c36fcc9bbde6bc35bfb433c6452faaa23be657f96a7e3dbfb1fb8fed2ec9f9ad1fcfef5c9fc978c27ebbd2fa886d75fb4bdbca762e7b628f3bbbd7ae619a916cdf3735b77b75cdc899cfe49cf5fc49f6cd58cfd8c640ecefe6cfd064c7d2132e467d20f1f7f98ba437efc8de9fe98becb7b1eb1ebaae7252d229bec8469bbf3b63585ec7663c8bfb3d4f249ee5f6efd85a5b3b74d2d6bdca2a1b1ebfc6b5beece5b1ab9c83782fb3657cfb853ff1ef5c4c03ef88b4e5b0d7fcbdadfbd9e61f7256d2ad539c49d4c4c6fc9c0cdc43ffec4b64d2bef325ec87f5b969abb99dcd66e4cf4ddbcc4f4aedc775809db56ceed6b47d62dbdbeec3d5b5ec93ef9fffb7beffc9735627da7eb775b29fa1bf8da169bf63f4ff90ce213cf363c43a312e2d5ba960ef5b8b746ec797952a75ecd732ff9e9fcb5e8485dd4563f4eac28ccf45207b00adae777b13d0f7a661bfe93ff737cf22df5bc48b647c1c9fa5cbfe7291e673bb00b7c8f2380f8777a19911a629fbf1647ce8d58d933df482eed962b4c887fdc57831091f2783d151d8b76b10612fcf17d3ac981c8461f438991a07671eb426d3a035bccbc3ac08a3c562b1342ed22ab85cacb362fcb4b0ebec7178bfd82c3e179b301ade4d4fa6d6951a3957cafcdefc7b3a7f595c04d5eea91f2c2ab3869f2daa8ba41ff8f1a2e67717f5c45f34fc9ed10dc345737ebd6865c5e27271b5b0b5be59dccede7c2f3ef72f1677899f98e7ba9191dfd12259dcdb7a1b1b34f13df35bcf7cc67e6ad2ac9aef1fccd0795c3c2597e63bf3bd79eecf7f06fe6d5237ff7e5ebc2c3aa6ecafe6df6fe67a5f7c24f545129f9b7a8d177b0b334216d9e2607118dd2dae17478be3ac085a8b22baec0f1627be973e79c9629285836e783d3b5c9c2ece06e3fef9e27ce92fbdec7e512c0353ef6369efc5ccb4ef8c9fb61d83cb65b8e5e9937dcef6c732faf1f9bff773fa346df7a692ff647f7867f3b5ef41b3e5306364b434e362190fefecfde9097f67fb1fe99876983e4d4683c3697b99ccd661649e4f4d7dbb66865f0607cbcce8d9ebd960b6b7ec1953bc1f1f2c07c9c9e2697cec45f1ebe42a3e35be696f395c8e867dafbdccf3e672bc9cc4f7fe831f2fa78bc4f6bfe91fd3ffe313d3573a0edca7b9a047da5bf966e7ce7226bec9c2ccc1e55cd615acafbfc4bb97dc5e5ff830f65ada9540231317669e2e57d82181f5e0d1fe560658bbd9dabf5cefe09ecfe57a592c3722d3969f78fe4c3e9d0e32d7f2c25cb66c90ffee4c1ded7d9c5b737b90c2b6eef7b1bb2996b5b033b3ebcb368dba9c0fd773118c2fedfa09e5fda07f5587301686f7c24c3f652dcadde3be64d32e0b53a6a5f5e9ccb56c623dc393b3318b91d4d1be5f725a601f5a5764a75dffb03a98eb18aeedcedb5fd695d89edcfbc0371e595e865fdbfb9ff8a4ce608c943606cbc7f53167fd95bee773cb96fc6e79293ac4ead28ce7208dcd927c8ace585e0523bb57245dc9194bbbd76269d2581a1d66638edcbf4e7f56639495527f7cab4710a759b9f32078efd2b0216ff7b42b56de59d65d1a0dd94dfced3bf35edd730dbb47ca1bfb8da5dd1f3c4b8bfedde06a1289d7e96261a75b7bd4d5d82bd9bfafb2e7b3070decae9bf63672076fdfc6badddaf04c76cbd87304f6ddbc7ab6ac16ccdd7b3ceefc6264f7397590beb1bb6dec67791f35968697a635968fcba791f16796cfcee694f7bf6fdf27dcc03ed9c29d25dcb833f11d5d47ffb357db97f70adade7af1926567f96adf0b63f2f0dc1eaf7b777eb2331e2f5f97f60dac67cb77279d6c9cab63ca6afdb85e30f7726fb1dc1f27cb03b1c8ec0cb23e1ecf71587fc1ed5279d8c622759fd9e9d7cbd9efd7b2b6bc7bef9fb86c19ecfa8addefa55104f43323398c33fd701d6037a5ddf36ba473af9dc56e1ce4a66d8c95b5b4abae2f720e24be30fd65f7661c64ddde265fd975a2e5f1f26479eaaf701e7385f39bfc1b02d24775e75b7aa5f7057c779efda3bd3ddf762db6fff24cbc603b07ddde95f2bed4d299697db71fce372ccfc54e2cefcdd418d82362253ca7f1b0f5d0ac5dc958cc17cfad2d2dd8bd59f97607caca937dbf2a03dee40a9c11077bf541e498f37e63d8af764dbadb7d747bbb8ee4375fce3e972ffa38dfddfb77ae4aa99ca6ad56466eaf2279d789f547d447aa8aae5ec5b2877a9588ae18f36d412772767f95a23daeb03b1df6b89d2d5ff62c97d63bd4f33efb9117b39fc48ffee68b33c5bda969c7b3576f9bfbb6be598b9fd7646f85dd3fb6eab6bfbe0f8c3e26fc6aab435699c400edba9cf59bf55c3fe3a0b415cafe6679ff9c5ed8f72b73aa22670b8d4cbe3576dad370d43db57b8fe2e770e4f6415a79e57a14ef1eb1f3f245ce27381df4e8ce4337ecfc5ef5567dbb276b5edbc62a9cccb89a8c54b7b855a9ed3972591bfd3e4ee25ad64687cd4858d9d3417babe1788a73662d1b430ae656060c2e8337ebb9329e6e5b7d35dab28d68aff2d5d8ee4674e7dbdfbe795779c59eeb737127fb1ec9bfe77db24647d9bd5ce9663559deaca62bab13dbbee7cacd5350ebb65bf99ccda2a3d57cd25f2d56cbf9e36a65f732dbb321f68480b562ed6871eb45ce5a95bd073666e5eaf7107dddcff4f0e3bebaf2a8b5eb23ba77e2fd1ffa7c91f2d112dcddefe5d6b8b9c3fd071d289fb6ced6c24c6f930b6f62fae4c897773dd660ff3c3a9deff674db3dcf2bbb13c993347b8746077767896de7a4865824dfb552515d62d3f2be7bc717f4c8754987bcae0a1b275e6ddadbb8cf71fbebbed4f219876bd141ee3c34623856ef0c1e569fab8b922e799788a2935b5ca17ad9eea329bffbf0073df28e5d14a7b0bbb18fa86766e1aa22efc0b5f9aeacfcc0085ad5657f17d3ed47c8d76af56ee84ef3ba3abc96e4fd6e1caaf9cdbd3f19d7b2b670909b72d9f298b65d35e59d62e5772d5a89349ac8c9b5fe427c3c2b33ed2e98d160d5b2fbc6ec3b469cc582758cf27ad20fe7f079710de1e12bbbd179f20feb9027e46b75a4a9ef4a67c9b68fe93ffd4a07d933aaab6b9c6367ffd4da5fde87a2b149c4feac54b57b2decb990d54dfbebfe8aefde359cb6bfb105709ebdc1f55ecf3732d4beb74fdedd27fe4705fb519b784f0663fc559fef8eed94cecf35ecbed5c4dc5b19ff62654feb9c96de25723599aa2cd15520deffeabf3042b9badf6a61b787ec436425cf72ac1ef26152f18b553beb8eec68f1a3b65d9b5f3dae9e448789aeb272977b95c6e1aab27a1e1fb97a528f94ff766dbbf4fddff04ef260393e58d9f3eed9aab37a9d4e57f694dabd17b9fce55d2dee9d20ab77a3bb5ac3faf0349cac3e96efe673b4f2567babfdd54170ccf527539f52fb717789db69f1cbf5891ff73b85fb76bfd63fa843ec2c3f0cee6c5fad8e56c733ec3891dd2fdbb57ab73ef25ed21d5fd231f535f6c3bcba3a599d7aab95dd55daee9eaecef1b708f8774b5acea628ecb99b35def3bff6fccef4d43b72ef9face26fc2ac314eb7efb497bf6375e3fec65af1133df22b19f8dd7b06cbb676f9bd45e5eb45cea2db13508c83db91ce5d073fdb95409de1e48791716b2337d621e2ea3bfb765cfc7ccf7ae26d17d758476d7de73b9f2bef76e33b3c86d375bc36d6dbda9ef01db575bf9abe0b70f74cfa5fbc6c2ccbae3bd9bf8fb236f2706d46f3ba676422d768ae65af5c62da6add97b5e1a9912e8b965818367665576ddd3beacba3ffbbb5687c9f60ad9e7b6275bf5d593effa7fc11eb3fd97707d8ba0fd03fa5f5f16057b7ec5cd6afb2d19bf5d05c23899daef36fc622c6a3f589ed2ab2dda7b71e97c6e977e3b96c1b95f7cf699afa5e14bec384b1229ead586bdce7abddfe5dfc06efeee3fbc7e327bfb19ecc47eba9d4d0eeee0efdf5eceb5aebcefe1b6ad653d129c1d57abe5e64954477aa71ef265aef4ad6a5d7c6b35dafc2d17a2d79592bc48d127fbbb7d8ae3e592fd7cae2856d651b45ad1b59be11dd27ebe8edc5173952fe7b7e7ff6d3f86b9e19216ba3f3d626fff5859cfb9b75b3deba9275d28f60beaeae6b569ad835605b1fbb93c24519ec0aeec356a7feb8ef69a7fdd84ed81deedeb4906ddb7577368507b27fee9fd325b20a3048d7f57543fe8252e8f6917ddd933b7d6aff5ce7b1af717a3c6e66857d0bfac4ee86cd313e9bbefc1d4a77fed39ebc36eddc5cf4d72d7eb7f37e94f2beb9edfe875fbd37befceec5f299b8eaee9cfac9557e3738edf9b6c8e5f5254e4dd93d40a675d6bb67ce4ab246f77de19c82931d26adf5cd8e5ff1c4198359627588ddd1725192511fa2d519e3b2e9db91e7fc9fa1d8a96b236ff2bbf6d73592f64fe4d35fb8522feadaf7c2d873e9eb7bc9d7e69f9e88bf61cff8bbbf8be26d756e794dfc877dafa5ef5cec6ae75c9eeae1b27f421f7067264df64bdffd039f36fff5c3babd7e94f8627eb6ed0fc6366d1ffeeafc885e0fb2c7796deab97ec6787bfd46475ccb7b78ac3fe7d6c276f7e77dd74ff6fbeffec6f0f67dbf3fd30be573d9dc67b4867cc5fcd4b3bf120b92b505fbfc87df59bfac3bebd7f5dbfa1d27801fd61fdbbd9a3fd121e7d21a7cbbcc285befadb10796e717f8b73f68b5857e1edb78967db70acf0dac0f204fed4cc30e36fb66212bc3e7d7e1647d349dad8fa3a3c4daaf27a57750eeeaccbffaee7c93763e307ab56d63fad1d1f4757dda1f87a3a8919df6fdde9d3d412be7692279bf17ac511be7d35341eff6344112bbbdb93a024bb141b6236357d8e75696c9e5b50abe85c1eed7fadb7729ee5c6ee592fb6e6dfecf3887cef347653df24d5974ffd84b70b7b6d2f0bcd728fc609e3ac9fc839e70ef2788edbb80cd9871ef862bbfff7857e794fffec8f2b77f7fa4baf3f99d5ff2b3fb5c2b29bd6784ffb67f03a4b0ab5d46c61701f448fb272d5a6e219e5b3123bc3069d8d9411d63cf22ba1de367a5a8b12feb097a26cdfa22fbb2d66ecf5b1411dec93894f559bb37c0fed585d5aebedc5d13f93b7c92135c6d792f7b11cbf99785edf1f5f6bd5eceee2ef94f5fecf69fe9de87afeda97e072d52eca5559d827387dcfbf08ffb231f523f1b81b7f9db98dcee99c41fa238edafbf9fe02c93fdbdddbf56d81380a1585be5b527ed43c6afaeb12f63d7efd8d51ffcfcb93fb2fb1ea8257cfff2f7d59dabf9e5f9ed1af5f6ddb5f29e40630f16693829ba8bb3c29d5c2a7a7ae670c76efd628fbe94ec6b9ea5e0fabb7d2bd1a8e8dbb314fdaaf82dd6e6b6766f8473cb3c87626749312886c5689e8e7c6f51189d61f7061463efaeb032392ea6bd97c5937feee3ef33aafef8d1fffab39f128bef488bdb732d5e50cc96effdf5bc657bdcc5d9e618cd9de8cb79fa7e54d211e591573e476175ee39628290d5c93e58d7494ae7f53012650d7b32fafa4e93bfdf1f717b256cffbdd8185712ef9eff70e78618ebfa690c0ef5347d5fcc83f9f8322dfaefc5a29b489b96fa49faed3a98f7faf6fda1edc5b76740b7efd4dff671f9efc1fca8477e36bf7855bfb9be7b8edff19db3909fd6e68e27abcfc2c8ee62d5feb2b6fe831dbb73b175dd0e6aab7103796792db0360d22a8c1c2e70f67e803dacc546648e5d632d3e8b8bf1ad3de1da767fa9c1b59ab90a53cec2d4a330e59efeec7dbb7fa71e698b4c8b0645dd9e99b67b538b86c8723b1b66d0893c7bc9730ee57d4e3ff826ef5f6386fa9eaa9b9d75a6f7ad0ed9dd37f59f5a67b752cc5ebbef7274e5b82af9a13b6bec22f1a0535f25565598f155b4b6edbadb4fba3faed296d5d9dff9d4eceb74876baa476a5fe6d28fefaaddd521bbbaa42c73656e16f6fc967946f63a195db23cf31b53e327b8774f2cb0ff665777bc977400d78c3f648dbdb8945dd1c555713dbe995f67cf9e7bf7888d83db952917f37910bde17ac3edf18ada83c3f587953d767d7a9da595f8c597f7ef5d7a83ec7af696568b9be2b6b82b8c27adefe9dd95257f7d8d5dce1a9a116adfd9523c743fec0ecbf4dcc870affd250ea556d67efbcbd90f3d53f325962511e1a22d116267853c6645017fad2ccbdd1b9d2af36892664518b4d59a0dffbff6feaba975a6690385cff7cff87cae2287da474eb2c12c4004033e9373c63955edfffecd35dd2d8dc632782d8c59ef7aeea2a684654b1a4de8dc579fa8cf27e27fb2f3412a9bb1707ee7c85824c8bf0f2aec59947128f37d1fd30fc977014e8ee2f7e30662f61295c513e7e8986b1532cd92e59902afc5a9a187989898d17a91ee167ce4335af8510c6c1ccd357e8f38aac53369d49aab8abcfc1b7448f39037d200174a37598017bcf6960b756ea1467071e045722485b6ea95a068f4e290f25e16475eb46e4a9afc171bfd3cbb6812fb8556223ad7be250b34fa1b6097b13f07b61b5d67eb35e4b9813e51220a000c29e45d003f0b188b8b63c2235c481ebb7814d92f84d8ed851aff05f8938c25f0017cf23b74388337d083f8fb052c27c3c5c5e272e92c13c4d7b7ce63ffacc94ee12c3dd19bfa6c5de8b1cd0d9fc11bb52df090e66de92fcbbf53fbf7d3b6a91eccdeeab337477307e8669d93d19cf808db64b6a1518f5e94c69e93269e58f5ef97956575a9f8ccb23e6b2f1b1c497f497e10587ae14f81cd68d95cb6de6bd5c2b23daa2d14bd98209251c70f3096bc67d4aad8fdfbd351f54363ef979c62e23d315b76140d7708070ab8b7da1a5125bd6ad95df6967dfaacf5068769ec2b4965c02c435cf0f21df8ef4e77a9c66339acbc2f4794a3283a9ad6ce6f96e379be9b47ccd760bad49899824db09cce52c0c7edea982a8e4e31a24a97b3515147ae3bb63eb343bd45cdef72ce91ef97225d553ce4516a4c173def4a2648719538259754fa8df258d7aff7266bfaf19f1c6dfc65e3fb3dd5d53d23bc278cf47211b53d6d6d7934e457ecaea5da01d343f25d036d1bf6a9b1da19cb154b2997cc4380b7d5210c62d439590a3696992762d3935dbf7f9a79c905f154f88181bbb14c31ed649eb14cd37b21a374a9fab7645e11f010c648111ffad2a5b1c5fbf4789c13eab7cb1cf38a22496dc04a411f205122bf46d36cec9e33c26a7e2f1bfa80a1f3e0b9c8dd08f485831df2106b6e75ae6121aaaf80ca013d095455e7aa1e7b81beb1440c02e7deec648e4c7d649d8f7c270fc1d1234ba7ceaa74285e8b109545defd84d698181c684ffe2d667e79354800cb6a79ddb900aaf1b2d0a9751acb9be52f8eb057cf5bde2eef902dd61f9507d349bda8b115b34eb13ce7ba1305434e95bae5bb7e7fc4626512fefbb073bdbc6fddf66eea374b0ffac164ac33559f5b33ec8ce5c3f271895da07dc4eaf368f93ceb3a3354b4d1e8e48c638b6be0efe91d4ddf9645f8a38065ac66f392b058eacbcec5f285f53158314e66a7cb57fdbec9e51bc54d97d987ff5e6c679725cedb61fc32338e4eb00c44178afaea77c34b96a05c1213ac737f28be4e57d3cb912ef9de18df00715dcfd7d4197731df47b5e4f2b83c88c52ffb135ebf7d3dc4ef68698a9f815d627962c46b3d867ac6474ddbd38d5d82cf4b255b2fcfc87685bc3d60d4c3ba0c9abc64da8bb8a7ce0bd1ef20af50f20c4c3bfa77f00eb3a915bcbce0fea4280f025968c80104dac5529d5f395c4b04f9fdeabd5609ca1d0122c1caa75805e820e227420635f24cf06e01d63937c4c6aeca8ccf7b4ef8043206c0b2ed30ee098ed89de803ee8b710d10dc04a3e4c0f0fd5f7ab1715f3be123871c8123b6ad22f18ec198ea290798caf06d9d53cdb2c685b7bbfaec3fab8f649cc5aad24f2302a47c3e196357686d2ce21dfb441f1169ab441207fc09ab2afcd3156f555bd5578dce01b0a5a07b089efd0a28701d67ac6d6ca81b78c678178aa656951c1fd40b2c04b904dfa38f00e3319758e8b85d96e99b73e849fd2a6aa5b41f1c5763b69ce95ccf05ea406277ac5a4e717abe6a43425c75bc008b173c45e754e21dbbcbe74aa1d9981e7613ef437fdc551463d553ad3fcdc1d6a5fd4c6ad7adde576dbc6fe2bd9e6c56bca00640e7543df28068f76a60485b8fe4d30f72012f19a76bc73c44e675350ceb8ae8f97ea5a84e50166da73ae0f951e3d9bc5c8d9a17f03381a2a879fdbfaf8fb07fa5dc261feb6a6c44177ce443dea08fe8e32bfb012ed80fc2b8c0d062250f1a3c66257e5889eb113fbaf4ebc40bea7105b4e43b6c5b881fba32e4fa22c50abc97016ac1cf2dd16f578c1fb6526335032598132fd43c48f185d582ea05a296e44ad1dd15764592f432e0e7c3b3ba4a91ed0f7c4747afa89db5e218e3a17ad62a435a3f227de01f814d0b3c44f252223e988390b60791423be421180fd4245e2122e7d40b700e747d15f4f995c7c6f3024cb595cb3c7797fcff67f5911745bf141d874fbcf232d458ba2461d9f15a9fe8236f952836a068e625b291ad72b4fa707e8c4caf31e705487e0cfaf2ea90ce5177c87e6ed6fe306d50bb7cff0cdebf3cd031afbcc27484feafa50b1ea173da291f72b1523b67754578f489413db5423dc066f50e1e536042b56bab6be82cd581e3f64f156daff378700428fc2d628732636bf1bb95e223e545b9b7ba616fabb68e0f757ea01e4fe8230635828f5f7203bfd3170fc48afa2dea62a20688dab58a2aac7e398b9ef6fe490d4b6fa2733fd26a8c6e413d1c8d03b053dbe3cfe9232cf72f5ec94ebfba33f88191a3f861f32c3e1213d723b69ff7e7d5fdf2da5baf5bbea9ed08fbe4c3f7874ee1197e07b512560f5c433865e073e4289e2bd0934033d5f880f7c1ea091cb3f63bb005564fab67aad514c465199896413c94c4f71e537ea6e00dac8a5e50836a22988cb6446b8fbf35de5f694229305fa889857168962a8d9e9ab715f34c5493d53c5efc4aa24f9e13cfac5d1abc6517f3f4b3fa08f2889504d1bd812fd8bfd29afa1acafd16726b44ea121e13ad65e41756afabb7c42471c31889052b579d730d2755c6c8d8854de4b363c959546bf5c6b84d7e0ed890743df76ae7b18b7ac573d44d7774adc27ac999d52069951295d541a2b33a74ba9573e004a8f7bb5e1dad8e9b6dd4f15b9dac4ea758dd8ee030abf100ef28fab73348b28390e76a1de864d0688e094364a5f4b3f2015dd75e4cc66b3ef6dff27f6c3b7feb47eab7d283cecb3d5f499035e4fecc1227ab0baa2ab8c22eb87538f6cf9b24755d17ff155562e715eddb5aec4c7ffc79ff08fbb351776a5a67b99769df6f638fcbce92cf06fd83269f4c948b0db52b93c87b169cc5b8380013a3f1bbf9488972eea12321de2c59c68a57c70ad1f6a4a25f0df57d7f48fc7606daaa5649b266f43f4d3913d55b3a57cf53cda5c931e7e778acf5428ae5bc8cc06608cc6275af649d9e9384dd8af50c78ef62c7f99338ba2f37e649d085928a472694c4976cd17b26db54636bc6b10f62b74b760863b1c9586a71b15a5f9aa79fd347ce880e366f56ed6417b6f85a9530d195bc1b892bfae4c833a76b15bd195a3fc7b66aba8891ec35ca24c3aa4658bc6b31bc08400ef8c837bfbf46273a70dc641f96d6f9db2a937c4f2a4d3a396c7b8b57a7981c55d3dd036736ee038316d246b301fb542f5ff59b3784673c85fdedae511e6a0fa83f56fca6981cb7a7c9c9f2daaff8478de270f85e4e4e7525bc02f9e47b8c92f19e55e37c4975ff9233d49e657f8bd633cc7cf6981db16b9fba79e4ba32b07726e7cdf7245005a7cea2d64f2e93eafd93c9baae9f8ef880ce93b348aa159b04a56df7ddee1161d770bcd6ff757d24cd7b3e47347338e2bcf24b2fb0956c4d7b36f091aaa03f9f5175cd0886a39d9f6ee64a9a9fbf918f24990fa01eb0f616de914f074873c8fc820d071e565d4f12f43e4b988c669d45adb31878c1824f0fad1f7e02f09f2478b2e345b0f6033d459d4fe6a8495d113d070f31e31bc7bbbfa9e95dcc7100627bac7609b312b63d8de17c403a0be2a5e11d85bfc48ceddd49fb597da44098ebc052ac979279d4e61bd66c4be216b4c78a7995cfa4dbf8b788e15a1cf7f3fd5bf23d3b73c69db4e54e9b8f7c872dcb3cbed0739257ce0c7891a8d6895a6189d7c110fa8348435211c06f3b45d4c0d5381f197f5c5e906daee1328e5446e34b516c755ee353fe9a2ae92a790d6b6e74bc0413b37cae9ef362f8b21fc5f7311f7dcc33ecb66b9e823e8cfaa8680a0cff6441bfe3b8dea927910557adb75e6be3c46cfada4d246f92bf2a57e56eb5a3784d86b17abc1dcdd3cfeb239253fc4a769b59977cbf5ae2facc5662d332b171f175413cf019c5bd6a7a74e685787ca5284f8bd4bbdd873ec2ef8f98db1ec75b95196fcacf7b816d4f7cd9c95bb25c6b4cb314f7ff998e5a6a135fc1b317e6e0e588a7203a3e620394f112de227aca8077a3993f62da0a9fc2f1dd877e92bca33833bc8f7e479639c04f92f78b4943ad9d86e820cf216f951a62bbe2f73fa88f3cb33ea038662bedfc028e54d2a3e8ef966ff1880db486242c432f613c5fec101d497dc43b64091a83d154cf7be6e78b8c69b49deb2331726c7054b431f930be4185212de1307e607be15f493d10a92e878c567cdfbdf167c3f3fabcd6776609d5e01ba80f928f4920402b9a8b9abd1ae7f610df118e63f2d9a22c26cf7d032a1ffb4b9e041b13b6b079697d9c0dcc925889eb776d5bf6f7eb54b0fb40f5265be9a01e8c1ab7fa6406fe591ad592451d7fe06abb24f827a4f485e6a5bbb14dfeb83e12c9cda8d3671dc50d146ca9d964626398f9d86fb40b922f5e185587ef5fbca01a19ae4bbe7a512cd7cff2f277d5ec5c4da16f465c31f2301bbfd8e6f4e80558eab134fc5e902e285f2239241e51bf21bf00ea6724d56f3b39c23c06a22b7854e28978aa543ba54cdd90475165662f92b7833c95ca43f85cc17c8cf857e27887e52f096c93717e9452f87d80e152328e6f145f37169c33c15be498de72ff9bd7672a9ca71fd447d2c65e05f6c403f0e65bafc992a211c5f7026c3158e9c98330bb26a8b7c83b04f416769ae421d964e697e4634870551b1f35c995bcae694bcaa8659b661bba997b9633fc23bb78bf57c60094f7541a37d7d573b5def04c56ef8a6065f10ad69824360f7d249b9460c2248f66ed41a9dc4b1e0ffafe39dd03e3957c4e9e244ffb8f0de4663a8e8b5c1344e6086a50404d044fd9f1b8dab441e3f5b9d15cae099017c45668c63698fd7b8bfb2cef56f136d65a7e0cfd36da3669dc77f100cb83e2b767141301ab8b3f699c4f406da6dfbc3eff0e7dc4a4dd4ddab3902d81833e2c1818f3a5b04268a42e3c327cce8916ebaac06d5878d996734e1ea7ee8917e6697c17cfd8f63d25ef9065e8f98c6c571144eab3183e62d166c4a1758b8882279f3a2a616b5be009c5c40209097e11d8b3e04f08fc4e252fa2b7e9dd8638b66668d3125d2e796949556f5ebcff294e4f8ce1156bfa6529e65efc596751bd918fa4794eb6aa24c7170432c12e6d579fc9033fa78f44f386b15717a81fd229d64f666aa6fb1215fd2678bf5eb4e202bc4ce5fa6d62d57ceee79d623d9f725209a577f494ac3e2044b7943fbea9698e19e42f7fd8af401fd9c5fb092693f025fdd91f63d43b4fce6c3e6b15dee1a97be69ab6fc9ec0488ccdc7901ac60e614beadc0ecd83484f10cc626db342e4e27daaac63c17c8af1b525198c654af19ee67836d7190ad821cf749fd17baada3f17dba0ec10b6b5993cc5ec9fadc56fd322fa66b84345b71ca8d599aa19750881cba3debb76ba23ffc7dfad8f98f415da34f057b95689c628545248aace91df975e68cf971d7240b517bbc75ee82f60dfb3b6915f504edffbd48be71bdf95a31ef78e668e0aeb28a8f38b3fedd736e2d3b0ca0543df5e5192f3a7a51fbe4eefaa63635ccec3959e6a2c2e524d8edf7ab276c913f95d509765a6f8cc50d1ee548baf3fa0bcd088de21f15e81c7d6e225256ff32eb1be0b788b956d6d361d818fac00a9b322f56fa47671e91be62aaefdac3e920bf6a6abf988d21f46aa3937f5362c7a58ddcb29cbcce7511c58b4543b314b753cc2ad3f74dcd9a5b67f503c96e72caa4f959314761a72300a8a7e4f1d3396773d3674d7fac8d4d04570843ee251dc958ed69b7a84fb751f62ef6a9d43e923211f09696c8df58620e3f829f4920a7ea3605196594749f5fb69e03dc247a457de09dfef897dee77dd9b146a9838957c6a40b919a921e212fc2becc45a43e2bb2a9e19ff16d8b81e6378c8267f4a64f754d6f00822bc6450ab2282bf7e5e3fa99734be599122e0039d7277b1bd7fb73e62d62e697a614df333aab70e6c8ff28317d49a8a70639f703f02fa2c58c2432fd03d528a1ea7c66c3f8fab3d95f2d663b67665578fe3976c93e978c443748d261383916d4db17ca464f09267e221c038c6ce81e4a56ba73f7a119b95c6cecfd18eac303290fe9de807f7d40fe434a2ce3baaf8614cfb6aac53132fac712be36ff272e103a67e68f779139f8991ac8218b25278dfe16d6aaa6b8b717ecfa8e685d859af7be2233fab8f888c2efa08fecf3a8b4a87b0e5db6ff562f7b872023aa871612d5ffaf47e5e699c3a33aeb73573729c874e7bbf086c8cde4ba2d3293ab3c0af6ec668c5f4a73cdfa13e227428cc45d1b50f51ef1e5a75ff9a6c3da0ed417c1a249a82e823eb34582a18e96cac01e90b7d41a853b49d2420cebf68e878ea4a6a564fbd5f53bc167608f40ceccec109e917a9796a915a92d4da2ba456a964e26c591d4e7b2bb21136aefce3d61557713071ae1eadfe99e71f0d5ef3813f44766c903764dc171ed53976c81d8f9dce0c6019c0fb067c81bf531f3163fcdfd6693c7802ea64cf1256fc9647752b74ed43e12322f35f78a17e82bc88acc51f5eaccf19ebf85d3c44def79c6a12a752965f40e8e77d0c46a24d83e3f26b0c1e625ed77e22fd2e95269e20985de03d03ceba828518f919ad2ed59b45de7be28ab0f353cc63e66a1e126f948515f157193c0ea880d8a5ba021ff33a7db4fbea197d36721951b94df2f231bf293577cd4b6f3dae6e5fbaa4ccd9cfeb23c44b9a4e2642eb67e34ecd5926fbbf526ac45239b6d73c8672f120a1eb2ec25e855a8d849b7b81ba8b1ee18203170412499bea14b55b1c0f0a9e73eb8478c4b9108f38e023bb9467a5a955d81ca6f2a92bac04aea5c5fe8640d208f4910df2fc47fe88185b135674fbdd292e2f12f37695fd20ea77ef6e883f0ffb58eaba750f5f12fc4ba942e52471fe7eace3e928be0df6c659e2bc59d1281007d68e957e615e04fbfd852ccb8873d07a4d33be7fc88fd73ad5395da36b9029c93875537e482a99e2bd8d8ad1467dc2f91e78c7dfa58f98f4a0697dce103fa8bf11ed7d5fb08471c23852afcc33525e807368c61237949490faa5665d7d9f2c72ccafe5e78ee567dfc54b32d4b785c3166d436a34f160027d24d64aba81bf6cb02b699b9792661acf941f823c12cdbb9ee8bcd8c0407dda9c2f0ecc7d581312522f596a624247b9a53c1f6d53cc5acf171ec67160c0e44fdd91ff475ba96ddec73638ade71c501e3f3218fa88439e908ca0ebe40a768de90fd9271ff9797d24e3881fa11ad89a0487556b6744eb13057f9cbaa719951a4e88c3d276b003a631409e035a99d265525eeaa176552fa61e139d55dee9f693e50163de2f347dc4a8df18b827361fd9350f21dc587704fb5542560bd1d27087304ed691ad8f7c9c3723ff23de20a869c5e720bd8037203265c63c20f554ab06188fcf610cb0e46d68cf6c29f55c7d207ba11e9f5767068caed602f926a962eac57c16f3887bea7f4aeda8d45ba7d93caf9f75e64eb171ed31ae89a19f887e75483111a91222e197add4417980aae6ad073d3f337fda38af6a0b8c3f8ee803732366e2dfd6474c39b3eeadf311c9272b501c52f9358c9cd7d5a6abf4bdce2df4087faac7f7e976bc20ff1bf96a5db542526a46827adc39eb59dfc54b4c1f10aab95d87345e6c422269691bd711c7fdda3ce3a3c6f789d513ee498f48a9fba68e69d7d4180955c765dd132d1f9cb275f9887f7fe2456d81291ac71eea144b751d8b8f006d15d2584add0bc870e003a809d2612cce40ffe27ee3b929cc19acd4e7e4a7d115d964ee24deedc48bea8f19631ebfbbfd34be56a07b301f89e66db057b0da87be91a8a52ea41e15afa8ba3f6e6b3c13f5bb2c67691d53a68d8e132d710daa3367562da62edb0fc97cdaa9f4aab78df374826ba9160cfd63d7fa8859eb8bce2d066345ab356268c55b93e72577e36030d4df7fc443626c4411694ce2aa9efd5be8246958ca1dc71d8c189bff9178089e07dc43f1d5e3ffee73ba9cae242ace9cb16332acc321c3ebdd59805a4177d1fcc7789ef6f1ab96ae564ef46f864e11b5c0d2358ecebff7a2befa279c4f3cadd42e49a6d2f5fa23fbd3319f88cf52d74cd28849f0265cc7395c2f6983fffffbfa88f00ec9f130692ff6f00bd333752edd20da03bb098e405383dc5a874f84e3b3505f35a0419e17d45f94baaab0d9a49b54174feb28dfe10fb17988bceb05c55811b2911746d698f2bcbf051fd932e2437855bf48fa08de7f7a67acee472fc0d417fd007a4953f5a17ae985f52c3146252fc8cb48b7587fb17819763fb023b54f43f418758f749b7cfa66ccb6b6ad614e3b1cff3cf002ff7992d745200b3c7bd1f562d7baf9ee35fa73fa88d005a2b909ad2f987e697058e80b0f4a16559cbd964a77577ebf8a382d689fa087abace3b69dd9bc3d705cec984e2add43fd11e786b11605af575b86d5b9fb64bea1deb0fde8cfd2fdca99fe9dc89db63e62d62f8c9353b7d547425bcc62557116e8bb44aa07bc80fd09c44708eff7539fb57d3ea861252b5e7ce16a25be1356632fef8f5ba26db38d0978591a6bf91745914ed5ca1eff727e4d4fd86e9866db9fc7b56aef9c597a605686667f869aa3f410baa347b506091b6c36bd2584229d2bff64f41f1ecea4bad7c899f5d26a3e808d5562dd12e3fbe22cd2132751ed266e03bf888ceb2e6d8f7fbf3e22ffc7ed55db270e8c73252da4a7145f54e61cbb3647f2c186b2945cbc82417f0ad173dae67e66d1235b3f31e995f9bbdfa55f663dbe53a04dafd76c8ad06227f4b307da7c1c9ff80c7fcce035da2f7243f4fdbd49bc2ab8fe91f4044d75801cb120be9b9e6da6d7d0abc6cc8350d141f75bddab31f2a2b93a1c5305de8ddfa7e7ebfa481abcdcc4e735e75cdd37bd54f3fb66ad955de29e7cd67e5e1f31f76a6e7daf1ab23c8e1afbb676e98fdfa735bf754248d21aade092626287d7cbe777c5476a0b67361a63c65827a17b1731e3880b0eb01873461fd4736a59431f09ebb22e029e60f6eb335e22d7482cc183534cafc8feafe3aa6c1ec0f92195d2308a87cfbfa3efe8983cb0f5918f790d284843edcee9eda00dc4d3ca0bf398fb5a1591f5a8b43aae371bf5a61e2fe08e28de6df1443d4e7afcdcc1335974a56a27f84f0fba0470c104673fa5b15b8ac00f4857d46a4fa65390fa827eb1b499567c0a71d04e1803c13a90fa2ed37e4c67cb039d9fffc2f734e6eb7f441f91ff63f76acc9e16f9946356d38a46a6735c8f43ed9a96a255e93c69f011de60e81d01968879df38da6fe72efe290fe17705fdedb0ef23883af7425a2e345fd7f432f985f81dd89614e8335bdabdb092313eb0310d946ed0bbe0e73d132f4e5f514c17f4151def86f71e7ff05ed031c43e77463b10b15e7a5e245f90710a344f820e03a4d4297b169d9097226619a814c1b5a6dc80eb9404d8bcb2d6cc77ea90716bf4e7fd23b2576d395f68356328d2aaa59827e46a8f045fb0b77c84dd0631abc8f0d508ca3a5b95ed311ef3204fe935ea1e65f8e44b4e202f9bbc2ad047a4a6b7cd137ec796928edc47f5bb72561d92669bbef5421b8fe4e8dd73fe083049ccfaea461e39f2da41bf71fcd47f22d7956815d72f17edc5ab3faeff22c92a7d47f158a39bfe207d4fb9efce893f460e8feaf3630caf9fe9f85bf0e249b9071ba3aee7f248be975943d3faa2e29733e730a8e1a27d50b04d35ddde0d50f6a8de8c17581550050395bf2336c034cdf7ead11f6bac46c5bb462bae0d83f9bcf99ff28fc8ff9bf411fbb3994fc858533adfa4a3661d362cb522d20f6a54cbf49d796d402353065ea31daf25b8281217b449eedd96a798f779a65a5288ba087884914fa1d145c12b1e0cfe61c46069f9fd51b26bb7e0212646cc3df9d061f71b5e1325692bcd7bfa8b69b89983835d90fdf8bd10c7a591390e884705310fc29f390e5b68bef6ad287e907e22ec1bc16186e505f92dc1f5c6b8c1ee987eae34d24a42832ea7e78f6380f7c64bfe767d44fcee54175e8f0ac77c2a5aa27d2039c51b8018ad565a1395237f0d8b7d356b3dd53a18f5bc13faed5ff8f39953d4715b05b6d384f5e3173a7f646ef4c36c66fdee6d6898fc2ec7bc042bebd2af94ef0d9b9365bbd2188ac867bf37f2330c5b15be4fbfa45fdf9fb6c0a9628c18b9bfaea800d49dc47b21fd9658f43ace225d7216e301c563693eebe97a5e88bbee46f006e8bdc5b6a5f135617d004f9b239bed6e35734e823973b56f25c57825391aeb9ae2e5a87132698f5ad32453844bca241e61a7aed56756d46f099e5573d207f5515abd7b4d6a54ee5bc6f93bf591381aee7d702fb659a186d3f894ea7547eceacc77342d83b473ec85b67fd173e4735c3fcdbefca95ec2b1ac5a6bb77cec92d787cf917c76c3d398e67ae4a63cbfa905750c4d0dfe95f48fde096143a64f897ea7b976a2b64389bc5f8d197f23d60dba55fa9cee87bc791d2797611c2c5327111f17d70841dd4550b3f69c7810785b5a741973bc247ff3848e13b7d12ab3cd6da7f859dbacd1bf571f31f5019c175fabc77e0fa91fe209eea2da1d6aa57593e94b20ecf460edbc637a96d3b59a52fde9f826592a77c6a3cac9eab29644959bee11be231fb2839c45a9c73e3572e06d5eb22dfe96f0c6291d1b6a770e3b821f16f2108dfec6982083638ed7b27608647fa977b5753c97d8ccdee87af0928c9349a0eae8fcb4e7f43ae501aaa6a58f190739e390fe567012d6fccca86201f35cf59b767f76803c98ca61c6ef1eeb772d46e623c7c7943eaff953bb54eeb513f0fa564e52d7a41765cacbe74cc5e0cdf360ec16f0b367aace385373dc4c9d7deb9eb33d2fffdfd0473eb283dbf9841ec9bd19a59f649a4cdb385e0b3a0baa84c2af92511ae658d1ae4c5bad1aac2497f054025a267a8a6db38fe30d9fbd9ff93b8e17c87404cd22d45e45a2425e47df8ee5b57c1e412ee227fa48246f5cce3f91b6debda7382aacf2b4e4fc9bfa59ed93b14f139e3d2a77eaba2e675ed456283cf9951beb1035b11582dfab39cf74393e4be404d137e477eabe19999b7ddab3a4fdedfac8e6df87b486ce1f38240b6394e74e31d3af9f64de9b8dccc0716b3789ce3cd54d0045e21db6a37a669819553c8da8833a4f09d2f0e799722f51d73274d179e51aed39877089bd20aeecf7311cd35ac7d1fc0cd24242f5e91dd1200ee755948c3c731d0b3b2f691c31ec9e52c5d3194b8f849dd25fcb2bf9e068c6e4ca0ee3d862608f61a70c67feedfcd21fd765fc44075c293e227a9aad8709af3f2bf79a4a8f582432e30c24a09431173927cccfc9b00e9975168389d3cd4c499f68ba9debcc6c389ade06f5c41688a7d0fc8c9ebba8018fec36d1c9a8f14b562a27ce25f5afbc70d6f483ff417dc4a4d59b6c4ca60f5be8cf03db3fd2437f04d48043b22ca2163b383b625d6117923c6d39f6149fe92819b99ef242599ae3bd6269cbefc4099bfe9602d3d053d258237a4589e3a71eb89fe721ed5fc321f90c0f39c647227c085127fa399c47329578683b7eee335f36749b37aa675b35e7d4f62b19f7c92cbc805f577dba87d631f01bd15b3ce3a87ed751fc3ea3f86ef517cfadccf13ef8c8dfad8fcc2d1b939ccf18df9bfe07f1ef66c886d43d5acd32ab4c1208caa8d35e663f36ea7e138d36564d81337c4efd714dada60c66536b8db86779d06a1b7c2467b48fdecbf405934eb2108c46c44d6532e42b89e46d14287f043e045d59075afaa5ed27d9929798fa4809b9e3747ef41e4635229a1d988e3a362b6df091a991cf638ebfd818339abfbab51efc1ed397641258ee819e48d7dc05b1b9aea356b8a3de197a08e2b2152f255fcb1dce6b9f0a70e167b31bf2bf346af089284dbdeab8ab2ba7db01f548ad668b7bba3f6aadec55c6f97bf511931699d7d87926568c4fd00ae43b862e92567467207507cf3897f132dc2592b3870a074d608df4092f57cbca71b5da7fc73f228d311a2163a37af238676051de4bdd46b53bb39060d4b373148fa6f1b31c838f6cc3430c5d26c0c57a0c71abe47d61290f72fd8cb1cdb8dee77c44de0fba5dceb8470c0fd131d6a7a423ea6a6d175ea8f331bfd0fce4997e03dc67b947a543715bd34114f7662fedefd64722b6728b87449bd85066da26a5ed5f780b4763fa81de7572dd945e6dac21131695c44711edd5e86f57540324931f2486a3cc1562bf60f3ca5c6bbf40d4b6b52d8f0cfb4ffe9807c26c498fcabd4c81aa8422661971021deccce3cccde2b596ec22c2c66975118da8eb146e63cbb231474a95001f992cccb5aa8e8279216c9486b37c6ce7b8664926c22b9bc11ca4acf7119c5d3aaf734ca617a3d7f62bf349cf09f33b52ac23e6fbbf2031a1ee14906633bfa66fd507cd4b161a778cf43e5d37b8bbca5c81a22d8789ce3b706fd4f7d5fbc46dbaa87847be3cf027ce4ce36cfda78f98b468132fb1e99c60c29af766bb3c72a4a59a3256499c7fc1bf26ab2c22fc809b8bd599b9f5a275dc4ddeb0edfb99581e19a28b520b16ba4046491c997bc22906b664a2c1fc0bf5bd5ec80f312f6ce717319b44e0a35a28aed331bac25f3c923e6b6cfbb3fb5bbdfb60aee433e79883b66bfa6ed46834e37fc11fea40007f217d2fa39e9d61db95e62fa2c360ee5019f48eb0f0338f466de19431b7df8d3f60bfe7dfab8fd8727f141f58ec3026bf014d2bf23584d7f8007f87a2d59541bf2c1e35f161dfafcbefc3c7102914d6595458c3caad65029f7c54575a7f8f28cf9b1a3a13be3b203f4ea54374103e99d4c8592415bf025658d785ac5e9feb77d1b8244ed19ff79cfae9f20e39e49a0f3e0b36ccc7bc44dbca4ad821ea7d9f08a581f0ac88b7f419eb4bd763c906745f8f63a2ef24ac9882a88d4b6c55922b7212f04bc2e7273d92e2743daa115251ef58ed38eee8977f9451cf6fbd388b96e87cea37a88f9bec977b4039d291fae0313ef7cd633fcba1c1c3e2622136afafffabfa88499feac6e76d7303b6f19d7894bfb06c84f536827a8b563d0c9d69540869b5ae137e46f43ec09c159da210d30fc9db8b7b874dbccfe499122f253c959f01f91cfc0c3c4eef608ee10aea81b03e63f391f76c98ff1fe8288267f516f2aa35ba8ce7d67e73ec6dbe6adbb4d43d331c2f9c415ea4637d7fc1185e45aa8b997931c604dfdb3e2b390a66a37cbf8bb5638f45d5ba4e5f1bf091ef6fe24baff251e2a7dcafde3b79c6fbfeae73bdca8a2d87f329ae65e584f2bba0514b9e869ceb1ef8a0f7820fe2b21f1a3e04a2a5af8caf32774cbfcde7fdb76956d8aa5aaf129ff28d532ccf6a495d01416a95d878bb7136ad7b8a5bc335a8be4d98c29ceb584705674597616fba31e21984dfcd99af7fa559b1d38b7b6791812ef29629650e38730a3a89ea43e6703643761c223a813c01fcafcc91fa4ef1d9aaa64ac46bba6ea31cd80749f7046ec12c83c822c2bc91e71703de77e0cc3876c235fbb375bbe1f988aecf9fe023ad6fba37e8d709e34939a14d47ea0c9a476d793d655a8d95f64231ada8671bd8b6848e0876b9498f0a46fb42bf47ae75ee9430826129969a52c20b237e9ef3101b45e77500d78a637303448963b20e683de4cce8b74557279ff1916d9b41f7c1b7106bac7dfb40b7635e832a759953aa26a479a3e2252344df4ca8de6106bef673fafdc2e655199a071dc79d339e578ae9435cbffe643e74db0b1ff1784fdee8f6a8f7ea4d4083bfca475c455f5c6073f4f3acf132fe94f010bb61874ccbe4770f2a3aa8d597b9e877bbc78a9ec12af9c0f4a810e97fc83714cd4a384ee86bfe3d7a35d375ae6e942e206381fb43abbf7c9fa112b3ee27c76c69c9f03a7c27b3e19cbad5693641b439ebf3b5a80e77972d23beaaaa768df64ddcf0bbc4cdc757e778ce6343f75a3487fe385b517c62de9d25105139251f4b2f4116048dd9029b9bdadd6db55bb2d5ea45b656f5ebaf3507fe96cc63b69e6d50ec173e5793ea9867bd3307bd0736302543f8fe98f9fb4ce305df713f3c5e5be15afbb8d9f321f37c13f09104efa16f3c6a3d04f25eff1beeafeedb50ab63029c11c5b197736ad0cc91eb373ce3e3234959d372b6996df1f903da31ab5ab6bd442df0ece8708cd588d8a631e757005b12f4b6c5ef015c41dff8fc87fdce76f83eea39d92ed51c1e6327abd5b5ba23dc14f41b4769780734bc278e59b5f2b26a4cb3eff42e389f1d507d3060f22b461419ffc9d36ee7233be4fbf87494f365f40d590ce78d87049ea5c6b876961d57a03bddd198f7cbc8ec45a465a59e9d8c0eb353bf27f3999d118fcb222602c8a7e0856a8cb20b3a6a3c1735fed965f4b9724cfcfa8df76885f3b1febde623b277beab613f42ae3cd0f4a6b5f6dd57efafeedd386a4fe7392fa8590bdb8e641ce9ca0685308e56fbb42b74d4e70fe8fc027478d5d5a8058d97f614354f90afa26df4738dd315d2fc03876d5706adda762c6c3e72cbf91a4afeaecd076d68b9bd838a17f04287a42f34bc93f0c7808fa855363c244c32d067d069d88c6a97ea9e8842a4da8cb68e143f1f7f3abf26ed453ba39887fa05d0b713b344d59995678e9b594ddfc63e6560c15734bd4f775ba99ad3cad486d9547990159bd214f988b00a4f53f0ed77949e9228f8b3eacba00ddc7b60e234a0c7488ea9c9a3e378c747fdcff071ca983d37d1ebf6a88f484b7cc33dd3c4b12131bd5b5823c87b086c5825d657586f11bd44e4ff6c86f412e47da046baae197e4ebef8005fc5d683b6b59bd832728169afa927a863b344fe1ae821bdc3757d4a620544af42ae5f4fd151d4451c5ed17559c4af15d9e760dd7fadbfbb9c0fb9f719e924f3348de7fbaddf9b3cd079f097e63de104675dc24deba871c82a0a97cd877e92d90dfd3e0b4bf239fd6eaeee9f55bb3e5ba0d88820f6ecabfdb6e7635d1fb1633d777dcc39a1dffa86eb8f48ada9cc0eee3f0726971afd16cbb9412cac17d40d0ca20639666bc0689e22ef8b1f426afa968fb2373ef48382e3766fa66f29b56b925746ce89d93eebdfba5d7fa17df16247b933304096149d018b6dd86fa3b6d49b17c47dc1af032b716b5af1da88a057bc278b28c6fbb9932868ecfc22db868afa7992e761cfc797c7df7837fd0eec2b7a9ebe205e387b0b7f7b2297e8eb671713a7ad45b3e257d456d091a8b5c93495bdcbdea7b3555fe918646f4b65bdec43d65b5df9e3446eda6f1c977bc30cc527d49085966ba616afcea2bb74c88735b5fa239fb7991fdbae958abecf5f10afb50b3aa0560850a8d77cd3864d2812737bc15186669c93156bab7750896c33f8434df40097f04ffb6ce7c1c4c51c3c137e15a446c91ff1a56a0efb7960e105cfccaa3e77eaa1cd4b7f5fa49cff203e2a673ddbe67dbbb26bd963c2f82bd927c288c16e101ea36b58aad55e61de9c3ef67b1d45e12666cc9c110f5c57bac9ac4cf8c4908c75c508252da7cd3951bfeffffae2bc54adcfa17fe4fb7decaeb12fab5bf94c7fe7587016994a3701ec0f2d6d4450dbe2f1a8869263ce79173a3750bee798db408f392404e8e4a473dd0cfdfb519cdfcffa19177bb6213e087825bd27b6e40a968ae11fd128d76a970caad9e72c70ac9ea88f3a36ed1eb5db8125a331afc82e17ff7cc1a209fd237f3afe769c178d8df623a11fc06f863daba6decb1f42aff374ad138d79a2aead749d5fb5b3ca59efda71abc002c66e2ae89c46f2bbdf386ef665d5eedcf9e3c615538357a222d9d7c4bc3657e78ffabf9cbbcac9242eee6c1bdfbb391fd638fd10deef269af6a72d47ba837f69f8a44d1e1113af151b0f1587afcb988ac0bdcdbe71cea3195fb66d3c575c33630ef83df07f0b5a7b8f56bfcebcb26a0d4b6e481658bacfb49b468cd535bba23cf2c0a790def06ce9db36f923bfcb47ccbc12d5dedbd983ac5af9038e4f90da31121f57e994b38db2818702be20710e8269af7e9f547df51bc6783864bfab0ffd5ef6484967c75e887793f2b69b1b737eec1810ddf612af65f3119bb67ef5fe9ece512f22b6b67760ee10c9cd5bafeba7d1df6cccf652fc758810d4d5c91c4270e3fa26eb3992dbf39078ba253c57bdcffb9553ecbef8b7e4338ff64feab6674f54638b83aeb98bcf4a7a999f4cdf10371591b5ed67c7cdc7578f26cd36e3a015cf182b9d2baba858f622e1573b895b8de7bf7474ed43c54716ce3df33dc159cbb16fe48175a897f24023e2ad329de66dc583de098ad885c7f2b93eaa4d8055a0780fe29ad77057b69a9fbf898fd4bdddf211894bbd209bc71a8a82c439597c24825b65238a5ab5a7a4d62c625413b6df769bd8d44d7cc4967fe57f648279d178b2080f618b7015769e4bc67ce4fc45ec1ec4adadc5226f1af3bab79b39f8e83c6220e0af425f6b8499827cc600070d630a3b15e703e918613366ee21ac09807869fc41b2ce94282eac8ddc98672b67f17778c9bfaf8f300d731d37d13db556ff5b68b332e579f091489e86cd438c7ae454edb9e2a1f6794f6288f0cc03a6777fa68fcc2274cba4f779c7ad4d81956ff2bab07fe02ddacfa36b0aba3e7426b74c3b04b9fb6ea5dcd37cc47336c5ccaef3915df290100b20c033436e885b7566d57bf094fa22f3bc6abb3a07d1adbb8dc6b9db745b6edbedd47a4e7199ccd6870e61b7e878e194c619283a2fd0d5eaa9d1aff14d323db81da931e9e4d57dba9c452c3cc7e623dbce4f8a6dae3fc747e4ffd8d8caafdd5bd318ac945e983b1244309af5c6df8c78ad0b2326f8d1c0a9f2a2bf973c14c43fa1ee6f8001b20bdabb2127d3edabf64e96dd35bd49f01c5f48fac37bc096e50ebcc0ff335c1afd3363cfe278499c6d6d577cc4fc5e748b02e58b061829aa7feeb0d2d0f85a29f2eb747b5e88b1c2b6b9c0d793a2ead9ee283cb754e3e26a6474efcff411e963ac8d6f2ffe119b6ed936e8dc17ef8f1a7a9a7e287aa2ebf25a1821817f21c4561f9e19fe07337ffc9e7788601fbe51dd0e48369d5fb524b01fb56fd7c410fe5dff4846fa6dc9bf920bcf7ef7ee9be4531a7a9399ef8ea343f889b32b97aa7bde137aa93be57ccabc81976bf7973e57bf3cfe1927ea8f90fb890f2cc5f45d78d892f251ca0bce6f5f3a0b7748d85cddae3fabcd027c469d9782fac9f07fe975f3aa6d7545e752e927397dfd223dae2f56f944c59df16f72464b6fd97fb1f1997e3b3eff17f84776757fb5eaa72fc8800d7902a4a47e4cfe88f090585caa18fd05bf73e7de6e6b869bf9d3f63d1953a57d1e2339c6f87fc03bdc05bd07f2f7e18fa04aac5e7c3d4133ff6517fac8b673643ec71c4bd14984df18b88df556390b9cc9e9947fcb3cdc5d1af73563b04d5c813f9d8f753ef2fdfa48485b7e075f6bdba3a76965116fd47e4d7781dd889852ac1e77b5d93fb275de38f2334aad828edd7a60dff5b63613db7f1095df858fb8119ae7211fbc9b685d99b50837e7b343ba6c2cdd64d9e1dc11e005df301f79d67e88a2a2bd2d57af285d276411d8e4a6413ecff7cebb39df266dcfd0fb3a35d431738a15485959ae05537016f5c3e5e37cea14dfeb9dcbe1d8a7586bc53b600168649d993f34c633ce96b5adbefbf7e7b3ef8a2e2bdad9ef52541ffc22b1f9ec25c33f525a6fc1ef0dfd05f15b880fd2f9e9362dfcca98d8f6f874f82e33a020f9466ee186a6f5ab1b450dd264d3c2e7aef009f1419c517e466d62f45b9eb52bffc857c641f23d61db3aa1237cf4ed09e597a0924695e3b70403d3cda0a29d17ad1960fa84be321feb7c641f3cc4dcab9b68eb9f1e53864f56ad0e17f81a39f69dc7e5839b7c246697d83e7ad88f5c1718c3865c8d77996f89d911c7334d7d44f0ee83715112c6312152e8a8934f781d76fcfb7d73d19a7841c463fd387886eb622ca0d5e747358da39f336c3fd31dfa47b67dffa83e44e309abed9de3d6b0faaf563769d493bc74afdb45c2c007d2d272e4507ec899b368568124d8b91b25992786b6b428affa5d19e7e7f2d9f7a18ff0ffb097b805da2541ac6c4c3e7b8826647c6f1fd972dcfbc5b88ec2af4c5af5a734d8967f2dfed463bde9231e12485b979c15c0b997a941782ff03fe497b88a0e37c41e9733faff19deef77af0b7936d74549295dca55e3ed2a3ee2726d60bc17fe7718771eef94e638b08e6d63b4df655b9ef26feb231927e44b39a7582f396eab4015aae1d388f292187de4de3a9ab4fa9122e95df881cffcb1c6880af587108beb2bfac84a9fa77b6a4c4a2515f9443fd7305d628e5a1a7b619bd635495a33baff227598b972d58e1f43377ba89c683afc6ae83ff31df947b69dff4c4c7b55ad46b83689a1fbd87e025f9c3d0a4e9a605b767e75ae5df5ddbca1c6a64eb1d17dd8b2e6fc3eb66ded7778c9ff863e82e6b1cdfc8272d351a3bc6fd3625b1fc1b9a7f8b82e91f75b8c798e7b0798b542a3fe9406dbf2afc19b10cf54166c932df888f873504d0d357375de0be35ac1a73d3ca61a523a46c0c60fdb873eb229ef869bf8d0578efbdc7927ea00de01fd4a5799636ccb3eaac72a0914f9a2f8dcbc25c97a2dd6c1d6effe643ea27ce4ffba3e92e5fc01dc53e38b00270bd1d76e71d9617fc947fac8a31d5b1bdd51ddd3f640e3d6e6743eb5590f2bd42376a58f68daa7a422442a16ad78ad8d47c2d5d2117ed7fd47f7057a92e2790f949584e847f0191d6b9675421d809e97f8b6f9b6f50f9b8fc8fb02b7d17766ee6b37051c159db5c05553096793e647c761ab559c4eb96fba0a1e223fcfd2e5d68313ea87612d99a8adf03f7d24ae71ae9a5bfa5c1f89d45167db166647cbf76ab6122b6fbd46c92ef511532ec77d9f2997705bcc78f41748df8b33aaefa57dd8afc48f705e6bf64d2f5a7b446c5b4f5f7887afac05f169708d46a0c9428faa705d7bbb663de2d1b47e891de487d82ffe01c7a7e5ac67fc2e2ff9b7f511933e1d18fc448d4ef362d92a9f7ca48f6cb069315615ceb907e55e50274b9e65dae03fe389bfeb1f51f4b0fdeabfea4a719b70b5acfa23a0a98da253740f518f50cdec0beeafa413c63df67ff959f7886bd51a7dd6388ddfad8fd8fe9014e7449e39b3660eb8ff6a77e45b05f718b995a4176287e85df2e8df9a989315a9d51b447656bca5d213db41053fc39f4fe3bc88ccd5ffb63e62c7cea25d9056b7b57f84b5747d7c269a063ce096600d4afda63ff5e5dafdb5f347e47ecf843e8ae8ef4f717fb9efef4a4e0f560a631a8236030b11abaa65faa2f7ad8fd8efcd3924c8515fa25a7599f4284dcd9ebda00e7180812fd804e7eb3c063106a92b9219024c619387fc4e0ec9bfab8f08a6de2b1f8536237e4bc9a6dd974ff411d31fc21183b01521a210928aaba322f89e1ed3a53963a5d8b6943fd14732d6ef804938571aac2ff5143fe625c86f41de8cae52f04cef9ff451933173d5e3ace471ce1f374e0dff8ec8ddf33dea2399e0fddce989e3baa76e71ac28106ab94f8e29eb18e31ee4849648c2ea1b7e2c1d775032e6eb8d28d952ddd33d631f5954dfdaaebefbbfaf8fc4c5b3b25c9f2a7cae8f04fc43eaa31f52be34ea082ee03f105fae8909181707f53bcd967f4dfdc6a3d8d8f7c616fa086335f62f39bf0ff7e0dcbd296bb6a34bc67689ab1bb24fff88cc0ff0fd536473838517fa45e7c49817838f5095552fc06f0e6221e433f052506de9867cf36b6be03f7d2467b4687cb1d64760050536f9a7f15a467d7444762076b655e8dfb7d4b58ce7a171d1959c1fcab9730363fe2bfa88e92316591abad408b9889fd71f1129e41d517fcf0ec51d3c386ed72d0ffc1cf9113a3a2a9df511799ec9d7bf7bdee5bdf859ee7962914cb3ff0abe0f919e1c89c11649cbbfa55d52abea9d125007fa9df60ddd9394863a98a3b1c1477e27aeeedfd747e26805e8c205d1aa4ffd236f5e18430b6b2fec2c52afd7ac8928b8bfa69f7a57fe1193ce624523e7714b7d04ef83b8a6a07e0ae7f0019f1d3c7188efccfc49539fda873e62f178d8a1908b831d52ab729c00ef927625baf38379c2ce79e27ca0378ac513bf092cdbb8befdee45716bfed3476c7997e28fe8dc0be528241805c8d64702dc78eb3cbc52493573ae46a4d1f4b8a835e01b43960f7de2a1cffa2bfa88c41be5023ea8e3c01aa7992bf803627987f1193b64e1ad8eda23e613afea5a17f7ada792a0af47f586ae494fb53dc2da9339633ef631ff86ad69de280f3a29aa0a81958ff9181cdb39978c85263ce691b06a82df3d528c81447d425e40d5711d4b20e3fe3bbef67f5b1f3179099e05ba9923f954631e5a762b9d3f724047b1bbe33bf8e4878a36e9b8a038fa13476f7719af65de4bad8624accf82b3f5e405182d1541b6f06887b817949bb7c6ef142faa2dd95f62c41447fab1affc11f31d117ff518f284a0b6704cfc9cde45bc73345a600c768dde290e61567666d6b37e878fd8328e9619fe097d242a5f8718b0cfce625c37d0e6c4a77e4fe8d2fafc93926b79c435d646a9f91cf8d4cd5cb5aff6ef33f9375a339d72f72ecabdfe15ef88a7505f82dfa67c49ef31440dc5b7d5d1424b7f1a6b8478e9ab3fd6fa538af2c0b90f8b4037907eed025febb36348cbc5a6e6d64ba97c73caabdbc01788f0f6c770bef44e30eac5c4c5726397745f17b544819ff5ea8476ad4db1c7618e66888b62d92aff117d248e97a4c896d3b63d854ca3ccfa23e32ac9c5dd21d5fff892dfe377c6a46ef4dbe6231ef96546092f5adfdda8cd8b2a37e07d885cd1bcc2acbbf5ea45eba4d8788de67cec2b5e4b9e8de8ff25c591e9fc97ebf01820249dd16713057c936f48ff9eadf53ddf7896f9eccfe6e2dfd647e4dea6dcabe5eecee5ace605bee8d0f354f1c4ae85363f22090c79e1ee65e544c9ee517bfe2edefb237dc4a46538deb0fd2c4d96035df3a96e68ae1ca38c1d32eb79939cd3bead971cf25f670d5b5b4adf2bc4f80d63a3d7e7e3bbe79d9ecbbc52adbc3baa182a3e73c1cd948a75828ea473f44dcc1ab1411abb446a276bf9e0dc59d40f780ca61b7888bdfe8487cb7c98fd9e3b8b7f501f91868ace6a16de575ed46f6b5a4c2f429a8511465476e0538fa3b9bb6ca63e62d359f9fe9978046c36366e98ae3baffa9fbae738e185b7ce2b74748617e67ca7bca8dd47e6631ffa8869db82dded9c6d8ecf848f1f8973f0580a3b33ea429afcc30bf5333b9eab6adb1b7f175f6b4d2ffca7f4919c611757e706e5fe7d2b6bd42d37685180af75ef05d8f2bdc5f8265130f2da4c1de13bf591d0176cd44ed7582fb3e989e213098e123f8cee12e8537ebdf7043f0ae5b27814a725b570a96e6e584737c5bc66dffa4894e733afa4f805d4a3d73cfe5d7881d20f5fbca04e4cf745bc8a060e9ae82166acf6a37f0bed7ed6e925344f7d0d702add98715fef5734ee21e4bb773fc247be531f319fa3e847b2cef5482c395673f233d6d26f49cacaf9ee73aeecadc7f77e178db5f511fb99ac17c1df9eab90fe14d871cea9ffb92ac529e95a1d292f8a8f6bf22bb9b7f9bf391ffbf28f98ff3f938fc4f49deb0a431764cbd398fd77142fa7d15acf42bdccae0520d837d85543aea7f847f3578be9efbfa18f84be54c32ee44d9aeef2b16bacac00978ae55f1dfba3f8484e8d4caedecbe41a0ee532d834fdab3c6f1b7d24d4a75ca92dab3fabfecc1ba31bf8fd358d7d23c90499b9fd9b6675a9add4e039de2488e9255f3ad1c267a3b6498a6397f7ad8f649ce83890bd6dd67ae839dd9a17d6393ea29880de7dc5eb1ff9e3f7e2e0763eed0fa639ff28c77a99d4b08c48676cfdc5795d01c3ce97b779c8a6f9583a89006bd8e025ff983e62d160f8a93b134bd67da3ea36429b746dd7ae1af52b2fea53ff4e1e22f4bdeaadc710dbcfe5cc5d8901061236fe06238e4fb2f946ccf59fcec7bee37e313f67403822dc01cd23de28f61775787b8c2fa6e3e49e292726d7422e65b6895d02fb5580c3cc1218e2bd1609e2bb1b799834d3ce277371c635860b9ec583fe297d44e83ee590b8ab9ee3fa81cddda8057540d535736d8a5c443460aee3b8e585c6748ae61fc4c4ef7c833eb24e73c3fcc4595bc9d653b59a4073735d3f9b7e7366bdeef42d072caa0cd795cd84bf0f9e638fb34d43f7a58fc8fb0bbf7c205e594b273a03c79bacd42e1f9cd7cf5b8aff0309dc45e5bdc700ab51eb6bcde1aa9df995ebe7de590fbb09299fced57c01d57016c92b7ec69d919b6abf7f8a632772cea22675be701ef529cfd6b16efe417d24c3f9d18afee406965fe12dc4fb5da088d890ec20c3b2119bb50f1e22cfb0f3d9e3fe4f11fe6ded063b99f40fb420c6d7eeeb36fddeb73e22cde269b911d571472d4b603106f10d76cc849aafb4a26a5db54372639692bdd006066d7de13396a3e0fddab93246d3eb43edaa1ce344a301735ed7503eb17fff8fe92342ff35b608326cfd0bd3274bda3ab8726e0a8d30371b76298aa30a9ca613aa8711a1c5bbeadf67fa88795e9e2f7c21a5e99dae6fa577067040607b2b10b67af0dbe907cf33e5f19fd447f0fc2ccf91a2d958d5f0f466150faf69d43ccd3f8a814e059900317359f5ee4ff5457bb83aeafe2209193112e29747fd329dc5807191dc1e53b688be3fe2f0502f3299a3dfbbba7664ba7a077b5ba49ee2bfa78f1874b5c5f13b9a137ba1dc0a4e8d6c1e2db92c58a63fa1a6e98b1dcff45d3ef74df9ec71b4ef818f268d145c5cef8331dfc41ff6ad8fd8be8a9217c404e85d7f66bc5b4c5e3ae605fe1ffc76a6f8480e3efa8710a312b114b995757d5cec82b4173afac3c47dfd857518257754efe2e6fb9fd047e47e62db56f427d15fb573498e6b327cb33aef1b517e8a76e5d408642eb5fc099a463ee91b431edd959cfe793e7b48efe6fc7f385eb320b72ec77ef46b67a6eb35a53486fac2e01d8233b508c62263f5e327f411b30f78fe0bf311ec8a39e98039c2472972bfc9fec6b92eed16d52f211d862a5a03a1afcf3829e315b2192ad7ad14df57c623942b22362d8d48eb117e7df5b93ecd659c62eda6f5aa74986aa40e16cfdb3fa28fa4d79f05ac586dd3923a828f64e91da8e7232a7baef847aac7f4ccf4437b1beefb1d6362e3fd7ec4031eaccf422f4f365cb72d1ff96e7dc4ec47cc3cc97b04d86585e8f9604e72e1717ac178c86a4cdad02bb21cafa63e277defe3bc918cf11c60402a6a39468d328cc393d54fddf77f421f11fa2434589d4b0cfa83729d6d5986e5b7a334c3f7b7f203b4bf453fa8ed4af43927ba8c4187b6c961fbaa3e62f29118fbbcbe3e1b609ad0779e81f115de5778d13a1ff9597dc4cc2f9f39e203ba09f8c522877c97824375800b016e3c5d23c71ce33a2b9e8f7a243d64528fca0354481da1424f100fe684b10ba6adcf9c07fcf64e3d57edb877c4c30d9d59d775ba465e4dc087fe217dc47a564b4954a850dc3f0f7dea65458772c01a872f5664e07dfa06ccf651fd914de73e3a1ff7dddfa68f989ffff499a28f315e41fd80751abb4ea5c9471e8ce7caefb84e7cb54cf57e35a67e22aedfff843e62d34e4563d323ff7501db4789f1a7a0d55d39ee60dcb8a8979cc5a4ca7159991df7e34ff4915df3d48ffaf153fac84747d5ca73f6876ce2c1260f446d441cef9cae3baa8f12d3c9236abfb3cee2aefdfe81f349b35e80ac048c824ebbdece5dafda9d337f5cbd57bfbbd5f3b1165bf18fe923429f148dce15c20a378809d5987e152f94553fb09fefa5d9fe917d3fdb9c8f9f1a832f34e81435a53f34d4dcb6525e68ebb3df53f48f07b28da1417799abb590030af76db816b47f646d2cfe097d241aafe522f6d59ffae34a92f3a1b90e49a294fbd5d33bc499e56e8d9a7bfb78ef4d3c7553fcd0f78d7ffc7cfc140fe163c04736f16033275474b14367b1b8f326cd42eeae8add21ba5c78bd81b7e68f1db6a575d4ceea29ca99bbaf8e3a4567d1043ef454eb3f4dad27e1fa69f8dc7f441f11de207ce4816a76b72fc2ac9db6fadd08f4c4f6a3fe0dfac8bedb4fc66beda219b50f1bb04d9e1975776dbd44d64421f4b134d47a484f152f01e6d8b3715dec7cfc13fa888da1f4ea2c205fa6ea946105df7af250697737ce42db3f941ea2f5911b87f8c83ede7b134ffd4f1f89f2918f787024de8a63ac4e1de8118a0750be8d3fa4638467aa63a54b7e91eeb259ccc172f35099e51e956c01ec8202f39a17e7d1096d83c1f3ff317d841be845b247b1b2e021d821c3438eed35f3f1ecbeedb3fda78ffc597fa5f1fc21ce2a32a7361f91f35cab17b98fb907b21c4bad48e135895f71cffa27f4918c139557e74e32f7d4b9ae5f867986c977606639ae3f6479151c9a7098fed3477e9287f0f1537d24daff20c6c01fb28d8b7eafe3b002bf888cabae214c3ba476e6cf66955ad2d799cd0ec52be4187bac60f0d469f8dc7f401f89c997489cf4968b4418a785789e865993dca043ffe9233f3806fb784fd3c78f3570e105751523fef8b8f9f897fc23141f3a15ffacd24366e9a4e03322a36afcd8eb346a4c2fd435938a41b7f6f1de9b78ea7ffa48948f7cc4836d3d23ee7cf4fb68ac0263346bccca2856251d250fd1cc47cafd13fa884d2bd284279be6a86920cba03e928eed34ede73fcd47fed347f6f39e968cb1969f62feb61c374eff843ef2ca7c84730650c7a93f55bbe48122a7c7adee0cd56a225853d0474c3ffb77bff7269efa9f3e12e523dbf2e06ddf338a8d12d6434ec7fcfe96f9483a7addbfa98fe85ce9996a8a77248a542f49cb9f8ca71eb17ffca78ffcdfe623196f7d0d7cb446ecd86333fef8df8ed74a87adbc70dcc6d1f83507741a441d289ed275f1c69cb7b75274a417f847f6f3de9b78ea7ffa48948f6ce209f67a89d33be2de378c050fe3b0e439d3e03bfa0c7d24b5fe9c7f401f316983d085176f929d7b93e6ab3769e57b4bf8dcd7f2d20adee7f4e7bbc7e43f7de4cffbfd3bbffbe8b3996f538b39f76fe823c29784a6bceae32251cd15732fd3d79cfa9cea391a1b70a35d6bdfb473dffac8265a3cfd0d7d64d338c5db9462797c6c9b1bf31167a3dad696b5e977c21b24363cc4f334df6b1def97afdf131f31f7a68d05b24b1a26f7132c8d7eee2d575a9647ea9999f9e830a8c361d6a1dad7bbdb72f3c6f8a03df4c33cf727fac8363a80d9d29fb4b87512778f5daf45f37f733e22efb7177d84ec0982bf5a8dd0a45dd170eb5e95aef6a92f9c436fb2b8f7c783e9f4a576ee4da627d4974935a02fdf1faf15f7ae391e8b9b6f7eaecd4332d67ccc793e3e93ff3f6ae94faecb399ff111b79675a44e58886b66df3fee39dbb68fd7e7fa7c18ed07f848c23ab72b3e62ee7dd8ae047391f349847f44b04ff0ddeb8e9eff27b4775ffac8261a5cf0d66d399fd1dd8fee6f1fbf3a3e9fdd3f0e2739ae6ddb071b5f20aa8f7c6713ba40b42161d0ce306f7b17cf90fb119ec6c2996247705e34e151cd025ae5732ef5ae9ebf5dff84362d1cc2fe48e87eeee3f9664bb15c4e7439b1c535ae930bc6c9b53e7f7eadd895e0c33a303e1b3c23f18be72615fbaced9eb1f9f8f9dc6434ae6342c76ad0b9c056b6473e2234bd669cfb2e3e62da25848720be53fcecc23b3ec2a7da65db44d7f6a58fc4f90784cfc6e98776cbc5b46de9b6f06af3fb57eb9cdcd3fbe4de329771facc2ef84822e65ec4473eb211ece29873423e329dd4024c41913977f11c537e159ca502d3cbb937d1f8afb06b31fd1ab9ba0f6e70ed77beff7aff088f65ea3c46e283be729c7ff27d38ce8b00434cb798f9b05bc87336dbe0ccdfcaefa7ceba7fc2e6216c5fd2f391fa603ee2d689f8cb53cefa18c7f57fd311bf09e76311b94f68d7aa334dfba6a38ecbc767c543b21d3a7ef7f3c66ffc19b4019127496f32c93236782d7780dfe9fce5c4f7bfbf7d1cb9f45c3d16fb787e2d7ad4cf97cfc8c52b73b37ee70cb995ad368cbfefda519eff44c7dca1f159dd6752e5cfe5d1a1be6f8fc7e3b3fbd6a2f7ddf8dc9dcc47c047beb3493dd71b4d337ee9bd3a75ecfa4a7fdad6ef930dce1166df52c779528dc4953aa23ec915d32d9386eeb369baa569f82ec661113b0ed2a64633e7e380e763a5c76511cc8b34397fcb2dee73f41a798ed9171d67abeb6931edc7ff89778d4d4271daf8fd95be1fd58eb1fbf13b2d1573fd67e317f0119e0f6b3dec511f9156dbf3f34406377118cdfab33fd9be4b1f11d95d3ec3ce2735dbf199f16ea1134c32c6351fe914e66f1eaccf252fd42f1e8c67caf566bd0f23177dad0e88cc8f3caf64dc4b9add17f319f67bffee1cc7cec75ef411910989c654bf4d1f91fbadd9c63dc2f04b132fc9a837af293ed238c20830c6ec3ef49175fa5edd993e62ea09e633d4e796faae76caf9dec0474f219b591db102b34e2b66ccc42624f741ec82db701db1c949bd5ed2f93cc64fd4bf57cfb171267306e662ced04b3cc12c718a895f6cd3421e21304c80095cd2f7c5ef8bfadc837e0737d2cf8cbe6611fc6fea34264fd86e7d561d5b2fdb1f1f31f7fb77d1ce8f9a4779cfbaf6ecb3e2f2854a6388aacd477f406b763926dfc5534dbf109f13ecf5488c81c7f361fe3e8e87487b357e2778569ef13b7e4e10cb20cfc26f042b1ebce0c50bf99ac9df6c9e224d303553deba5dcd7c5fab2fbb990fcd47be9b86466d1ee4cb34cfefeafe9b1ae53ecf5c20d31d7b9376d39ba4ef1d1788d8b913835e7ef7fbafdb7faa3b7b8e69634a05e7d9b6571e807fd450c1065538dfe9e800d5756ac41edb4deef76abc8760ecdf514e9fbebfde09541fa5a69ed938f526f512ea510287c699e54e9d59e59c7503d4b03ad07e2b578dbdb62d02b364f2c67d422b305fba56d7afd05ff5ff9d33ab3eaa6bcff89969ddbfa2e6451e788c8ee9e6cf06afd9767e36f191fdf947cc7dfd9df15a9b1ad7df1bbef496fd43aabbd7291a74edbb9fbf694cbe93a70aad9723ea442187e69c723257334fd3786dd3d914476563b7e33ec027bba07ba09e16723e751cdc05e1ceb4d52a5f287e93529f9b556a99153fff84efa1be6b1c7a411e8fc6eb4d7bd13c73ce3dc7fd076d45cdb836a27e96fc26e5ade3fd7fa4577d3417f67c04d7ee297fc4dcd7df1fafb54eb315ed5bcd50d76adc2244a1dcb9b6abcc02f9f67bdf3fae8571a6a92fdedfbe5ee20c966a8697541f0ab862ee69bd302bad8e926ffe78f15a3f71af501b2a51019d0606b234e796ae635a4df7d2fa1c300ea72fd54ee524f1d09bf51c7f3c2865ae528a2f2d2f3ad7ed66eea28dca487d6f922cf7d3be925c062fa8ff8b4a16ed66baa2aecf75ae474da73877da83fa75ee32a9eedd56fc67be6a36862ffe6c39ca5ce53afeec7da8cecd12d7d3c3cea59bf5c733c597f24ef57579df4dccd5ee9caa3e76516de94ae94935d5c7bce653517dc4aebff2f1fc84f361cdd51ef988eccbaaf1ffaef8c86736995ceea0adf491b6da2503458fbaf7444ff5f7a51d3cff77fb27ed9be2b5829834b467aac5b268d07b57d5731b8a6e27d4f9016ab068fdccd3345bd713b469b9e814fc1bf08e7c82eba6abfb75d4774bb51b3b2375ee95723fbbeabbd63b654a0367f9fd9e6a8a2dd54e4d28a92aa3fa9044ec1cf0aeb26a17299ee62bea95f7e9fbd6b56aea5cb94535ab50d955675eabf19aaabe0f81483a57f7549f07d78cb175eaadd79fdf767dd9f31199a7adf247c4bfba0b9aba8bfc914d74d98c199d925d5ed345c5fddfdbe01ffe6d7346d5def2657fd65d8acd24e67d455e35db2e789adc1f72ef92e3833e9297c5576de659cb3bce49c6877e01f91fefaa7d11f83c2cf7564e6252bb290fc66ac5fa07b4a2a58e208e7a45ab7bcf9d7e37a9f483b9e3bfce1dc76dcf6ac979da7151d7a3bb22bd42eb18cdf14d4fe90eef73e2c5bab6cb4b58331d3866bd0342fdd3750a0fa4a67178ae7c48b899a8af2e0d5593f215c2d49cab1d5551bca8a2ee39e8d2fd9a33d5df17f4bde26994f30455aaeea27a2a106b07b3d9cc4dccdab7f5c568599fe7abce0ce3c17acc624d5fcb396b3a4720e384e783f5c47c242efec53cc67d6fda2d64cf6dcaed33aed3bed6b8fb9af625d35e21f7f7bce8feb63f9bf691025502eda132a81ac9e1886850e5996676a4662c5f633bcf677d8e1b179b1f70ac518039cb36a0866bdd9beb6640feae2b1a39e11a1891e79a74fbcca0e7f85f72f1a51fa0e9eabd7ab754d7a9c7efdd519420df209a8c9a5d159f28435063f88d57af3adf2fabff517de2803e830780e6af147d7f573b093b2cdf54b43f4fbc02558ef47d9ed4fbded278e233ee27f7b78f664d6354bab08fe553e37afb7ef77cbd755eefb8537a2ff0aee12df1b486da612d5826d4580d212b9c5bebe9848f2f3c9e9e319ea28fc4f3915c402f176bb4739d9eba6cf3261f6681fdbc520f358cbd25db834993898f446331e999e135b2d7f52a7150636ac6b6787daf6a9f6df399a0feea4cff4f75cadd4caa72517eec5ce6d52a6c4e2b5e6b4e68a6ef638c3461c8f7665cc735cc5958ab9bb7b14569901be903f555eaf2119f52ef50eb693a3f6bab9db380c4703e9be5dbf94ef7bcdc7d7faf2fe66a6652a3cac9cae9e67be9faa2f3d09eceaae5c1fbb473d97cac9cf4c00be6f50534dd66c11f27c7ab76beed8f51b939afe86dbe47727f67b19c244f99221c50fd47da15525b385a63b87c34e8e1a8cf3f1a752351031d55d592cb650f3b51e918c363ba26a82ff91877dfdf3dd22e19bc1bf5c6fee03ea87ba9778d43bb1c481f8d5faadfefb383a6e2afd05d6a73e82fcc5fa06fa5746d7b93b75783dcc4104bc5e42326efb0f7529c0c67c66aa60c3a9ae1a3d8416c9adbdc702ff3c8f7d4368c336ea75e886772e685f69a94d10ffefc3e181dced5b37a6a16cbaf542514dc5eea790fd40aca5e311db16352ed7e65ac71896b621b337dc469ea3f6c3da0f1dd1b929ffb905ace8926bf9788d6a3c6ef44d1695f7db7043ed81dd1764813a0916dc5474625da052d753fac5afce1bd502318f23ef42cff9c7e8755a2df7360ae3aab79448b27237b758634ba794bf7c373c063b0434c5ea4af2b7df08c6d5ac9b86fc9baff96d7077d609ea36b961d53e571e84dbd5f34d618f756827977c15b5bcb938ab50f343fd77cc48e595a97f36db92d3c9fd27e56b69307f770f99cab6b9e9bf13ca5c9732487e0d571993785f56caf81efed8ff383c4ace3555f1bb97a01752260cbc8a895ee1e414e56fce4499d3b51d73d33bfb9a3d61cd54f06155a79ed34c9b77a87bcf9b7b51a8d647ee868fb4fd267ffb0f9bea12dcefde0fdc3ffb38ed4c470a5566c52ad64c8f3ab97f14d7e44abbefb4cab0d2bba7c8236e8a17f22ab3756520942d14648858ffeadac72fc062bc9ffc5ed9ade07bb9ef8a392e52f58967748121a0c6ad528ad8fd268fddca3c130e00dc24b9e154dbe0c6932faaaeff9c2ab50ee07fa7fbc035ea2ee337c64a9ebfccfaea75d22bc508dcb13c6407dd67da6f7812e8335911f67aef29384ef98f92924232422f202d779dfd2ae15679391f3c24fcc7d29745ee46a693837dcf00c432e6c29da9e6f931f630a4e3fed389922d9617a5da2cb3e6650ad8aae7afb461dab51ad16c5a312eabb8a4bb616d062ade5496d5d8ce833d974741fc1435e36bcdf261bd9a6ef3cae6da1fa38573c61a5e8ae7b473619d4636c4127b8a095a76d3d6a65778ea95fa8d98886ff753df937e6797ccccfe83aacc8619d6c46f939d1dcc14928b7bf8f425a2ad7f7cfc3dd61d368f42b8e8f681e7349fdd5dab868e86fc65176c857f9084b7d5fe2494655589115deb3a1be84392f4b5dcc73c65bb3f560531f8934f68face786a11d382606d1faf7a297202f43f18c1adb929a6a266a8abec22692af2626f5e3ca49f3b17eb2784d74eac7f5557e41951ed1dc73aa0101fb7d17b6fc1459223b1763b7a3becf2fc98601cb1f68311a248eda5b3fed1f38453feb67a16ff4b2f955efd871df1bf80eb85af383acda551dd040754c1e54bc60b5a8d5d6873f173cf0c0d03f4c39d46c531e0be133af4e14cf29ad7dc0b3761fb5c3d3dd91479a32e87df93ca4e19a462a391eab9acee5937ae59f100dd4c712fd7e70429fdb15ff96760ff51f3b032b33dc5554ef51ff7f4ff7c7fbd60ee9fcf034ca3b36eb23e1efaa59be97b92b1e896789beb22e69fdac3e621e032a23fdbea777d576bc553e35ba72dce60dfb7c0a2cdfcc9da89fddb071321ff98c86dae7cc3df84cbed099a2754b456f6655427d833e3050ab66f440bd835cdb9c926c08991a0d16495fcdc88c790378809b255b0af800e4c9f113bd2d6880b6b7b32d0335aa348d2e91f531387fce92cc19af4aa1a93ca3b036ae44d711fe67dbac3ee3a5396b1c8026a1ee0b1fbe7efe79947605f4edd15805f08aa5bd807780c6d70ee3e571b1e500bb18bf89ac268bfe6ae94c2417e703da6cea2371df3f7a6bfd2e9fc7dfe74b7ce4abfa88f4d51c0b93c7b10497b9e82df319d645326c737cb5e6f62d6e1f047e76d3266cfa09c42e6f606ec3f60c3b817b5e4f65faf542db4bccf36a65e7ddf762ab4b741e9638c8ded51cf550ece7e5c3c1102b19964669d048f17bd8667a6a97b46bfe512691cfe595c402db4ce549c9d5d8292c2743bed4e70fc8deae3ff3f7d0d6f477daca4b3424a081588dd07093fe71e7a6fababca01aed8901d93a8c1c87a8be61dada44767da66b14bf5c2c5ebb37d0c4810989f79c1db33cfcccb3f448bbbcd60c79048eb5c6682e2b582ad2c5d2e647ae33ffcc7a8a4133710deea7774f839ff564c8e936cd363e933e32f46c5a2cfd0b6d57f67de47b1ed79fd647827e84bb431a3e634d8c0bed615e51e54c8af3541eb44dcb357886bb2906c4f28f98f6f9e7b041c6467c4e0236168ff844fe9a6d2c25a69d6f7c3c229a8ed522766c99797cc668986f10d8c79907689b8c69cf37e9af671cef43da13274f4766d7b3eea3ee9f47dddd36d99adc2bf21f07ef1ce727326a82cb780c5fc85ea5dffbc0b2f39736f42d46c2b0edfe7147d34f10797fa1a3f2ac4796c34d199d9fb9511f89e9dbdae7b8f7b179e31fb62feb2396ff25721f354ec90449f55a07b5f55f23966062c6fd06f38f3d02db3d68e2a04c713dd527c7d5b130b9ca49329bb9eadd341bed666fba9ce46f206bf72e487ad2924f82f6e9fc8269f93dd3bc0db607ff9a69a749e3c426c13270b0ab3ea255b65cbc89d6c97dc546f448b60e78ceb42f173e5e25fd3516e96ee2b23f404c11ec67da8e3ea0463e6cf239b79c7a2a39aebeb612cd2a78e6f48e76b3f082d8d564cf3cbf63f97c4836fdf3e8f591e39b415befd78f7ec1a0f5a66d4776e19a6d6b5d1fd96e3cedf7326c485fe12116b5f8701e3f9adfe0685c2ffa93d3afb6eeba09e8baa95ef5ae71515f941fabafab4262965773ed2a89b4a63405a5a3741b4712ab10d42961bb563343b6a1740b9535158d54aba7a7686d2e4976fcde3dd999612f07cdd4d6d433da1d364d5ba3a146837c0c3e62fa6423ed31a409b1b4ec23fa65cbe506af0af412ee9f5ed53ef7234316e25197fc1379b5ea1b4aca6b252966b5b5245e01bb9a12962633f85d94fed07ba0880c6d5b3af6d67786c9f32c5e213c1634fcb7e56ffbbdbde8fb06beeb33de09b71bee63ea23969eb471a76fe2275f695fd547ccf567f058fddecc5331bfbd278a1b802f1e5139d08ff3f7142fd65414b3aac621c536afbc4747c42c38e7d8230da5455495bee1677bc7a91c623669b5688d986de3819c8ff6423e4d6d773ef7368fa0b93b5827f1af873ae646df4ff4085bae3469da8734ec031b8bf17bfddc42785eaf0cd87b947c3f3f227f84f63ab1b68f11852e857a8af0e2e958e13a35f16fe07ef30bff76766c3c3f8e863d867d90a3f00ebf309a073cc2fc7d1cadfd8006cb7bf50e3d6bdc797cd7c6f3637d2476bc3fdc413fac8fbc7996655a64071ecf22cd29641fc83db95a68eb42c37c4263984dfca37cc159f4677eb63f7366d574a33877441f014dd4deac63f2dbc2670b8f16ecedb0e36b1a78493615cda1cfd8ce7f465af087b4a6e405344bd3dcf7d08e2f7b7d4d76fe8c86f1c8c4ca9fe6bdc41e736ae93feca7c0f307bcca250a4ff348f60b68df7581c645dbca4ec3f78ee8099be8bdcdef2c7da2f2f0c1f55b501e737c3f1c0773bc8cfbafe923dbe879f6f73be0275fd54736c58999f162b26e4dff8e5c8f6a808843cb3f504cb4d846493fc61ea1f84dc86d6c5934f766408348eec48ec1eac0ce88ec8e8f6696ef45b69b418fbc52c65edf441b2c5a134bbb6cde12acd0284f32bd5de8c740bd67fe91fc0ada1ef4c636a37bbeef7dd8e49dc5eea4479bffafd56dfd28466f7ab48ec1f7f3927ec6672be323e967edf7162ffa607c491f11db5a8c7c1f370fa6dc6ff3ce3f3a7a5fd74762fb698cd53dcd6be037e1dfe9cf6c33a43886c1d0bf086524997fe2239af3f35ed6fca2492d79109d01b1e347f48688c6f8f14ce339c255833d1ec31b02fde129469e8eb36d99e7ed26b4dc7886c423e9880d5b5a8a93cd0daa1119e992419b6c3dea33ba68af8c8f7e6bdedf6ef6f98ffa6f5d1789d72a19f78b7b9ecd033f9aebdf69a51dc66b6dfafe39bcbf50765306d05e53752eff443243f47acd470cfa44fe5bf2f16235c867cd5f1ea3b451dbd137d99ce2e4eb12e9239b24a735f972d37db6a695cc430686ed855790d647021abee93e3caa4dbe5e6c381be4fb753dc1babf79d4ef1e43c3b7399ae3f2e4ad8fcb9a8d2afe3e14c3c4f31177ff381afdd9bcfcc97117fa88fdfe46bf484e083f4bd44f649dbd212661346f2fac3559123eb2339af0c97ec7de5d8d7ff3ba1dd8dfe36c60b13ee33d363c7f75e77d4c03bfb989bfea27c741e623b26a7f683e8696bc414df311fddf1769c14747e639e0a8b5fa7cf4edcffbf0482dffccff7fc283beeb081e5dbe9c97b45eb6c7f70e69ad7fab75aa839f9e0f3ae69f7ff0f9180fac878321c57158dfef918f987b754fcfdbd8fe44eedd71131afe23fdb8ff6f3eb69e0f2fe423dfd938ceaa14fa47227e95bd8d4425f48f8c423fc5be6723c8edbe1ccdc96fb38716d1fd581f3967ff489cad6c1b4bc2aec60373f0b0613ef6b43e3896b0277e2cf33cf1916de285be720c7a7116fa96bff3799f1dc9eac97e929fea87436361c6b5edeba8fd0585bf673e341244e1e7e7637816ce87f0b6b2f6b393ff5bfce0bb3f0a7dd0b91255ff0ade19f1717ee77337f607b9da79de25e7fb7fbef8fd25067aefef2ff37144f311998b1f9a0fcdd77f7a3e12341fbdc3e858b07f447cc7df75647f0476c732c5a3f19dcffbec28f15a092fcc0ddcf3f3311e188bfe0f3c5f68b6c6c19afce03cc8f184e7e3d08bc632ec713e300ff962cc7c9c628f0c0e47f3c1e1d0fbae63e561349f8c06c3c969f7b635c9bf4ce6fed5773e6fd3b1fb88e360382d776ff3afcdc5e474345fccf6df8fc121de1fe331ade48b83e1f73f6fd0c3f3c27118f4866743a4b6e9f9d8fffb478f988f6995e683fa89feeeeff96a6df62633c5432ae17c4c46f2fd60f8fffbfffedfffe7ff0f035432c6</data> + </image> +</images> +<connections> + <connection> + <sender>frmMap</sender> + <signal>signalTz(const QString &, const QString &)</signal> + <receiver>CityTimeBase</receiver> + <slot>slotNewTz(const QString &, const QString &)</slot> + </connection> + <connection> + <sender>cmdCity1</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity2</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity1</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity3</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity1</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity4</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity1</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity7</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity1</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity8</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity2</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity1</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity2</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity3</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity2</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity4</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity4</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity7</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity2</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity8</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity2</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity7</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity3</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity1</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity3</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity2</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity3</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity4</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity3</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity7</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity3</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity8</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity4</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity1</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity4</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity2</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity4</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity3</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity4</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity8</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity7</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity1</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity7</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity2</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity7</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity3</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity7</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity4</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity7</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity8</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity8</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity1</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity8</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity2</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity8</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity3</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity8</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity4</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity8</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity7</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity1</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity5</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity2</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity5</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity3</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity5</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity4</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity5</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity7</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity5</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity8</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity5</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity5</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity1</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity5</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity2</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity5</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity3</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity5</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity4</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity5</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity7</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity5</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity8</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity1</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity6</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity2</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity6</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity3</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity6</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity4</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity6</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity5</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity6</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity6</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity1</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity6</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity2</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity6</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity3</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity6</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity4</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity6</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity5</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity6</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity7</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity6</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity8</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity6</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity9</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity7</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity6</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity8</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity6</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity9</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity1</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity9</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity3</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity9</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity4</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity9</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity5</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity9</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity6</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity9</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity7</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity9</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity8</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity1</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity9</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity2</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity9</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity3</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity9</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity4</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity9</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity5</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity9</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity7</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity9</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity8</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity9</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity9</sender> + <signal>toggled(bool)</signal> + <receiver>cmdCity2</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>cmdCity1</sender> + <signal>toggled(bool)</signal> + <receiver>CityTimeBase</receiver> + <slot>beginNewTz()</slot> + </connection> + <connection> + <sender>cmdCity2</sender> + <signal>toggled(bool)</signal> + <receiver>CityTimeBase</receiver> + <slot>beginNewTz()</slot> + </connection> + <connection> + <sender>cmdCity7</sender> + <signal>toggled(bool)</signal> + <receiver>CityTimeBase</receiver> + <slot>beginNewTz()</slot> + </connection> + <connection> + <sender>cmdCity3</sender> + <signal>toggled(bool)</signal> + <receiver>CityTimeBase</receiver> + <slot>beginNewTz()</slot> + </connection> + <connection> + <sender>cmdCity4</sender> + <signal>toggled(bool)</signal> + <receiver>CityTimeBase</receiver> + <slot>beginNewTz()</slot> + </connection> + <connection> + <sender>cmdCity5</sender> + <signal>toggled(bool)</signal> + <receiver>CityTimeBase</receiver> + <slot>beginNewTz()</slot> + </connection> + <connection> + <sender>cmdCity6</sender> + <signal>toggled(bool)</signal> + <receiver>CityTimeBase</receiver> + <slot>beginNewTz()</slot> + </connection> + <connection> + <sender>cmdCity8</sender> + <signal>toggled(bool)</signal> + <receiver>CityTimeBase</receiver> + <slot>beginNewTz()</slot> + </connection> + <connection> + <sender>cmdCity9</sender> + <signal>toggled(bool)</signal> + <receiver>CityTimeBase</receiver> + <slot>beginNewTz()</slot> + </connection> + <slot access="public">beginNewTz()</slot> + <slot access="public">slotNewTz(const QString &, const QString &)</slot> +</connections> +<tabstops> + <tabstop>cmdCity1</tabstop> + <tabstop>cmdCity2</tabstop> + <tabstop>cmdCity3</tabstop> + <tabstop>cmdCity4</tabstop> + <tabstop>cmdCity5</tabstop> + <tabstop>cmdCity6</tabstop> + <tabstop>cmdCity7</tabstop> + <tabstop>cmdCity8</tabstop> + <tabstop>cmdCity9</tabstop> + <tabstop>frmMap</tabstop> +</tabstops> +</UI> diff --git a/core/settings/citytime/findvalidzones b/core/settings/citytime/findvalidzones new file mode 100755 index 0000000..f9e8b5b --- a/dev/null +++ b/core/settings/citytime/findvalidzones @@ -0,0 +1,38 @@ +#!/usr/bin/perl + +# A Little utility to help tidy up messy zoneinfo directories. + +use File::Find; + +find sub { + if ( -f $_ ) { + my $a; + open T, $_; + read T, $a, 4; + if ( $a eq "TZif" ) { + my $d="$File::Find::dir/$_"; + $d =~ s/^.\///; + $D{$d}=1; + } + close T; + } +}, "."; + +open Z, "zone.tab" || die; + +while (<Z>) { + next if /^#/; + if ( ($cc, $north, $east, $z, $comment) = + $_ =~ /^(\S\S)\s+([+-]\d+)([+-]\d+)\s+(\S+)\s*(\S*)/ ) + { + $Z{$z}=1; + } +} + +for $d ( sort keys %D ) { + print "rm $d\n" if !$Z{$d}; +} + +for $z ( sort keys %Z ) { + print "zone $z, but no such file\n" if !$D{$z}; +} diff --git a/core/settings/citytime/light.png b/core/settings/citytime/light.png Binary files differnew file mode 100644 index 0000000..2aab906 --- a/dev/null +++ b/core/settings/citytime/light.png diff --git a/core/settings/citytime/mag.png b/core/settings/citytime/mag.png Binary files differnew file mode 100644 index 0000000..9cbd32b --- a/dev/null +++ b/core/settings/citytime/mag.png diff --git a/core/settings/citytime/main.cpp b/core/settings/citytime/main.cpp new file mode 100644 index 0000000..e8664c6 --- a/dev/null +++ b/core/settings/citytime/main.cpp @@ -0,0 +1,30 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "citytime.h" +#include <qpe/qpeapplication.h> + +int main( int argc, char** argv ) +{ + QPEApplication a( argc, argv ); + CityTime main; + a.showMainWidget( &main ); + return a.exec(); +} diff --git a/core/settings/citytime/qpe-citytime.control b/core/settings/citytime/qpe-citytime.control new file mode 100644 index 0000000..fcec4a6 --- a/dev/null +++ b/core/settings/citytime/qpe-citytime.control @@ -0,0 +1,9 @@ +Files: bin/citytime apps/Applications/citytime.desktop +Priority: optional +Section: qpe/applications +Maintainer: Warwick Allison <warwick@trolltech.com> +Architecture: arm +Version: $QPE_VERSION-3 +Depends: qpe-base ($QPE_VERSION), timezones +Description: Time-zone / world clock settings + The time-zone manager for the Qtopia environment. diff --git a/core/settings/citytime/stylusnormalizer.cpp b/core/settings/citytime/stylusnormalizer.cpp new file mode 100644 index 0000000..62de28b --- a/dev/null +++ b/core/settings/citytime/stylusnormalizer.cpp @@ -0,0 +1,98 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <qpoint.h> +#include <qtimer.h> + +#include "stylusnormalizer.h" + +static const int FLUSHTIME = 100; + +_StylusEvent::_StylusEvent( const QPoint& newPt ) + : _pt( newPt ), + _t( QTime::currentTime() ) +{ +} + +_StylusEvent::~_StylusEvent() +{ +} + +StylusNormalizer::StylusNormalizer( QWidget *parent, const char* name ) + : QWidget( parent, name ), + _next( 0 ), + bFirst( true ) +{ + // initialize _ptList + int i; + for (i = 0; i < SAMPLES; i++ ) { + _ptList[i].setPoint( -1, -1 ); + } + _tExpire = new QTimer( this ); + QObject::connect( _tExpire, SIGNAL( timeout() ), + this, SLOT( slotAveragePoint() ) ); +} + +StylusNormalizer::~StylusNormalizer() +{ +} + +void StylusNormalizer::addEvent( const QPoint& pt ) +{ + _ptList[_next].setPoint( pt ); + _ptList[_next++].setTime( QTime::currentTime() ); + if ( _next >= SAMPLES ) { + _next = 0; + } + // make a single mouse click work + if ( bFirst ) { + slotAveragePoint(); + bFirst = false; + } +} + +void StylusNormalizer::slotAveragePoint( void ) +{ + QPoint pt( 0, 0 ); + QTime tCurr = QTime::currentTime(); + int i, + size; + size = 0; + for ( i = 0; i < SAMPLES; i++ ) { + if ( ( (_ptList[i]).time().msecsTo( tCurr ) < FLUSHTIME ) && + ( _ptList[i].point() != QPoint( -1, -1 ) ) ) { + pt += _ptList[i].point(); + size++; + } + } + if ( size > 0 ) + emit signalNewPoint( pt /= size ); +} + +void StylusNormalizer::start( void ) +{ + _tExpire->start( FLUSHTIME ); +} + +void StylusNormalizer::stop( void ) +{ + _tExpire->stop(); + bFirst = true; +}
\ No newline at end of file diff --git a/core/settings/citytime/stylusnormalizer.h b/core/settings/citytime/stylusnormalizer.h new file mode 100644 index 0000000..d5e44a3 --- a/dev/null +++ b/core/settings/citytime/stylusnormalizer.h @@ -0,0 +1,70 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef STYLUSNORMALIZER_H +#define STYLUSNORMALIZER_H + +#include <qdatetime.h> +#include <qwidget.h> + +class QTimer; + +class _StylusEvent +{ +public: + _StylusEvent( const QPoint &pt = QPoint( 0, 0 ) ); + ~_StylusEvent(); + QPoint point( void ) const { return _pt; }; + QTime time( void ) const { return _t; }; + void setPoint( int x, int y) { _pt.setX( x ); _pt.setY( y ); }; + void setPoint( const QPoint &newPt ) { _pt = newPt; }; + void setTime( QTime newTime ) { _t = newTime; }; + +private: + QPoint _pt; + QTime _t; +}; + + +class StylusNormalizer : public QWidget +{ + Q_OBJECT +public: + StylusNormalizer( QWidget *parent = 0, const char* name = 0 ); + ~StylusNormalizer(); + void start(); + void stop(); + void addEvent( const QPoint &pt ); // add a new point in + +signals: + void signalNewPoint( const QPoint &p ); + +private slots: + void slotAveragePoint( void ); // return an averaged point + +private: + static const int SAMPLES = 10; + _StylusEvent _ptList[SAMPLES]; + int _next; + QTimer *_tExpire; + bool bFirst; // the first item added in... +}; + +#endif diff --git a/core/settings/citytime/sun.c b/core/settings/citytime/sun.c new file mode 100644 index 0000000..d3f3731 --- a/dev/null +++ b/core/settings/citytime/sun.c @@ -0,0 +1,323 @@ +/* + * Sun clock. X11 version by John Mackin. + * + * This program was derived from, and is still in part identical with, the + * Suntools Sun clock program whose author's comment appears immediately + * below. Please preserve both notices. + * + * The X11R3/4 version of this program was written by John Mackin, at the + * Basser Department of Computer Science, University of Sydney, Sydney, + * New South Wales, Australia; <john@cs.su.oz.AU>. This program, like + * the one it was derived from, is in the public domain: `Love is the + * law, love under will.' + */ + +/* + + Sun clock + + Designed and implemented by John Walker in November of 1988. + + Version for the Sun Workstation. + + The algorithm used to calculate the position of the Sun is given in + Chapter 18 of: + + "Astronomical Formulae for Calculators" by Jean Meeus, Third Edition, + Richmond: Willmann-Bell, 1985. This book can be obtained from: + + Willmann-Bell + P.O. Box 35025 + Richmond, VA 23235 + USA + Phone: (804) 320-7016 + + This program was written by: + + John Walker + Autodesk, Inc. + 2320 Marinship Way + Sausalito, CA 94965 + USA + Fax: (415) 389-9418 + Voice: (415) 332-2344 Ext. 2829 + Usenet: {sun,well,uunet}!acad!kelvin + or: kelvin@acad.uu.net + + modified for interactive maps by + + Stephen Martin + Fujitsu Systems Business of Canada + smartin@fujitsu.ca + + This program is in the public domain: "Do what thou wilt shall be the + whole of the law". I'd appreciate receiving any bug fixes and/or + enhancements, which I'll incorporate in future versions of the + program. Please leave the original attribution information intact so + that credit and blame may be properly apportioned. + + Revision history: + + 1.0 12/21/89 Initial version. + 8/24/89 Finally got around to submitting. + + 1.1 8/31/94 Version with interactive map. + 1.2 10/12/94 Fixes for HP and Solaris, new icon bitmap + 1.3 11/01/94 Timezone now shown in icon + 1.4 03/29/98 Fixed city drawing, added icon animation + +*/ + +#include "sun.h" + +#include <qpe/qmath.h> + +/* PROJILLUM -- Project illuminated area on the map. */ + +void +projillum(wtab, xdots, ydots, dec) +short *wtab; +int xdots, ydots; +double dec; +{ + int i, ftf = 1, ilon, ilat, lilon = 0, lilat = 0, xt; + double m, x, y, z, th, lon, lat, s, c; + + /* Clear unoccupied cells in width table */ + + for (i = 0; i < ydots; i++) + wtab[i] = -1; + + /* Build transformation for declination */ + + s = qSin(-dtr(dec)); + c = qCos(-dtr(dec)); + + /* Increment over a semicircle of illumination */ + + for (th = -(PI / 2); th <= PI / 2 + 0.001; + th += PI / TERMINC) { + + /* Transform the point through the declination rotation. */ + + x = -s * qSin(th); + y = qCos(th); + z = c * qSin(th); + + /* Transform the resulting co-ordinate through the + map projection to obtain screen co-ordinates. */ + + lon = (y == 0 && x == 0) ? 0.0 : rtd(qATan2(y, x)); + lat = rtd(qASin(z)); + + ilat = ydots - (lat + 90) * (ydots / 180.0); + ilon = lon * (xdots / 360.0); + + if (ftf) { + + /* First time. Just save start co-ordinate. */ + + lilon = ilon; + lilat = ilat; + ftf = 0; + } else { + + /* Trace out the line and set the width table. */ + + if (lilat == ilat) { + wtab[(ydots - 1) - ilat] = ilon == 0 ? 1 : ilon; + } else { + m = ((double) (ilon - lilon)) / (ilat - lilat); + for (i = lilat; i != ilat; i += sgn(ilat - lilat)) { + xt = lilon + qFloor((m * (i - lilat)) + 0.5); + wtab[(ydots - 1) - i] = xt == 0 ? 1 : xt; + } + } + lilon = ilon; + lilat = ilat; + } + } + + /* Now tweak the widths to generate full illumination for + the correct pole. */ + + if (dec < 0.0) { + ilat = ydots - 1; + lilat = -1; + } else { + ilat = 0; + lilat = 1; + } + + for (i = ilat; i != ydots / 2; i += lilat) { + if (wtab[i] != -1) { + while (1) { + wtab[i] = xdots / 2; + if (i == ilat) + break; + i -= lilat; + } + break; + } + } +} + +/* + * Sun clock - astronomical routines. + */ + +/* JDATE -- Convert internal GMT date and time to Julian day + and fraction. */ + +long +jdate(t) +struct tm *t; +{ + long c, m, y; + + y = t->tm_year + 1900; + m = t->tm_mon + 1; + if (m > 2) + m = m - 3; + else { + m = m + 9; + y--; + } + c = y / 100L; /* Compute century */ + y -= 100L * c; + return t->tm_mday + (c * 146097L) / 4 + (y * 1461L) / 4 + + (m * 153L + 2) / 5 + 1721119L; +} + +/* JTIME -- Convert internal GMT date and time to astronomical + Julian time (i.e. Julian date plus day fraction, + expressed as a double). */ + +double +jtime(t) +struct tm *t; +{ + return (jdate(t) - 0.5) + + (((long) t->tm_sec) + + 60L * (t->tm_min + 60L * t->tm_hour)) / 86400.0; +} + +/* KEPLER -- Solve the equation of Kepler. */ + +double +kepler(m, ecc) +double m, ecc; +{ + double e, delta; +#define EPSILON 1E-6 + + e = m = dtr(m); + do { + delta = e - ecc * qSin(e) - m; + e -= delta / (1 - ecc * qCos(e)); + } while (qFabs(delta) > EPSILON); + return e; +} + +/* SUNPOS -- Calculate position of the Sun. JD is the Julian date + of the instant for which the position is desired and + APPARENT should be nonzero if the apparent position + (corrected for nutation and aberration) is desired. + The Sun's co-ordinates are returned in RA and DEC, + both specified in degrees (divide RA by 15 to obtain + hours). The radius vector to the Sun in astronomical + units is returned in RV and the Sun's longitude (true + or apparent, as desired) is returned as degrees in + SLONG. */ + + +void +sunpos(jd, apparent, ra, dec, rv, slong) +double jd; +int apparent; +double *ra, *dec, *rv, *slong; +{ + double t, t2, t3, l, m, e, ea, v, theta, omega, + eps; + + /* Time, in Julian centuries of 36525 ephemeris days, + measured from the epoch 1900 January 0.5 ET. */ + + t = (jd - 2415020.0) / 36525.0; + t2 = t * t; + t3 = t2 * t; + + /* Geometric mean longitude of the Sun, referred to the + mean equinox of the date. */ + + l = fixangle(279.69668 + 36000.76892 * t + 0.0003025 * t2); + + /* Sun's mean anomaly. */ + + m = fixangle(358.47583 + 35999.04975*t - 0.000150*t2 - 0.0000033*t3); + + /* Eccentricity of the Earth's orbit. */ + + e = 0.01675104 - 0.0000418 * t - 0.000000126 * t2; + + /* Eccentric anomaly. */ + + ea = kepler(m, e); + + /* True anomaly */ + + v = fixangle(2 * rtd(qATan(qSqrt((1 + e) / (1 - e)) * qTan(ea / 2)))); + + /* Sun's true longitude. */ + + theta = l + v - m; + + /* Obliquity of the ecliptic. */ + + eps = 23.452294 - 0.0130125 * t - 0.00000164 * t2 + 0.000000503 * t3; + + /* Corrections for Sun's apparent longitude, if desired. */ + + if (apparent) { + omega = fixangle(259.18 - 1934.142 * t); + theta = theta - 0.00569 - 0.00479 * qSin(dtr(omega)); + eps += 0.00256 * qCos(dtr(omega)); + } + + /* Return Sun's longitude and radius vector */ + + *slong = theta; + *rv = (1.0000002 * (1 - e * e)) / (1 + e * qCos(dtr(v))); + + /* Determine solar co-ordinates. */ + + *ra = + fixangle(rtd(qATan2(qCos(dtr(eps)) * qSin(dtr(theta)), qCos(dtr(theta))))); + *dec = rtd(qASin(sin(dtr(eps)) * qSin(dtr(theta)))); +} + +/* GMST -- Calculate Greenwich Mean Siderial Time for a given + instant expressed as a Julian date and fraction. */ + +double +gmst(jd) +double jd; +{ + double t, theta0; + + + /* Time, in Julian centuries of 36525 ephemeris days, + measured from the epoch 1900 January 0.5 ET. */ + + t = ((qFloor(jd + 0.5) - 0.5) - 2415020.0) / 36525.0; + + theta0 = 6.6460656 + 2400.051262 * t + 0.00002581 * t * t; + + t = (jd + 0.5) - (qFloor(jd + 0.5)); + + theta0 += (t * 24.0) * 1.002737908; + + theta0 = (theta0 - 24.0 * (qFloor(theta0 / 24.0))); + + return theta0; +} diff --git a/core/settings/citytime/sun.h b/core/settings/citytime/sun.h new file mode 100644 index 0000000..2091621 --- a/dev/null +++ b/core/settings/citytime/sun.h @@ -0,0 +1,57 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +/* + * Sun clock definitions. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <time.h> + +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +#ifndef E +#define E 2.7182818284590452354 +#endif + +#define abs(x) ((x) < 0 ? (-(x)) : x) /* Absolute value */ +#define sgn(x) (((x) < 0) ? -1 : ((x) > 0 ? 1 : 0)) /* Extract sign */ +#define dtr(x) ((x) * (PI / 180.0)) /* Degree->Radian */ +#define rtd(x) ((x) / (PI / 180.0)) /* Radian->Degree */ +#define fixangle(a) ((a) - 360.0 * (qFloor((a) / 360.0))) /* Fix angle */ + +#define TERMINC 100 /* Circle segments for terminator */ + +#define PROJINT (60 * 10) /* Frequency of seasonal recalculation */ + + +#ifdef __cplusplus +extern "C" { +#endif +double jtime(struct tm *t); +double kepler(double m, double ecc); +void sunpos(double jd, int apparent, double *ra, double *dec, double *rv, double *slong); +void projillum(short *wtab, int xdots, int ydots, double dec); +#ifdef __cplusplus +}; +#endif diff --git a/core/settings/citytime/zonemap.cpp b/core/settings/citytime/zonemap.cpp new file mode 100644 index 0000000..337f4d9 --- a/dev/null +++ b/core/settings/citytime/zonemap.cpp @@ -0,0 +1,670 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "sun.h" +#include "zonemap.h" + +#include <qpe/resource.h> +#include <qpe/timestring.h> +#include <qpe/qpeapplication.h> + +#include <qdatetime.h> +#include <qfile.h> +#include <qimage.h> +#include <qlabel.h> +#include <qlist.h> +#include <qmessagebox.h> +#include <qpixmap.h> +#include <qpainter.h> +#include <qregexp.h> +#include <qtextstream.h> +#include <qtimer.h> +#include <qtoolbutton.h> + +#include <limits.h> + +// the map file... +static const char strZONEINFO[] = "/usr/share/zoneinfo/zone.tab"; +static const char strMAP[] = "simple_grid_400"; + +// the maximum distance we'll allow the pointer to be away from a city +// and still show the city's time +static const int iTHRESHOLD = 50000; + +// The label offset (how far away from pointer) +static const int iLABELOFFSET = 8; + +// the size of the dot to draw, and where to start it +static const int iCITYSIZE = 3; +const int iCITYOFFSET = 2; + +// the darkening function +static inline void darken( QImage *pImage, int start, int stop, int row ); +static void dayNight( QImage *pImage ); + +ZoneField::ZoneField( const QString& strLine ) +{ + // make a bunch of RegExp's to match the data from the line + QRegExp regCoord( "[-+][0-9]+" ); // the latitude + QRegExp regCountry( "[A-Za-z]+/" ); // the country (not good enough) + QRegExp regCity( "[A-Za-z_-]*" ); // the city + + int iStart, + iStop, + iLen, + tmp; + QString strTmp; + // we should be able to assume that the country code is always the first + // two chars, so just grap them and let it go... + strCountryCode = strLine.left( 2 ); + iStart = regCoord.match( strLine, 0, &iLen ); + if ( iStart >= 0 ) { + strTmp = strLine.mid( iStart, iLen ); + tmp = strTmp.toInt(); + // okay, there are two versions of the format, make a decision based on + // the size... + // Oh BTW, we are storing everything in seconds! + if ( iLen < 7 ) { + _y = tmp / 100; + _y *= 60; + _y += tmp % 100; + _y *= 60; + } else { + _y = tmp / 10000; + _y *= 60; + tmp %= 10000; + _y += tmp / 100; + _y *= 60; + tmp %= 100; + _y += tmp; + } + } + iStart = regCoord.match( strLine, iStart + iLen, &iLen ); + if ( iStart >= 0 ) { + strTmp = strLine.mid( iStart, iLen ); + tmp = strTmp.toInt(); + if ( iLen < 8 ) { + _x = tmp / 100; + _x *= 60; + _x += tmp % 100; + _x *= 60; + } else { + _x = tmp / 10000; + _x *= 60; + tmp %= 10000; + _x += tmp / 100; + _x *= 60; + tmp %= 100; + _x += tmp; + } + } + iStart = regCountry.match( strLine, 0, &iLen ); + // help with the shortcoming in 2.x regexp... + iStop = strLine.findRev( '/' ); + if ( iStart >= 0 ) { + iLen = (iStop - iStart) + 1; + strCountry = strLine.mid( iStart, iLen ); + } + // now match the city... + iStart = regCity.match( strLine, iStart + iLen, &iLen ); + if ( iStart >= 0 ) { + strCity = strLine.mid( iStart, iLen ); + } +} + +void ZoneField::showStructure( void ) const +{ + qDebug( "Country: %s", strCountry.latin1() ); + qDebug( "City: %s", strCity.latin1() ); + qDebug( "x: %d", _x ); + qDebug( "y: %d\n", _y ); +} + +ZoneMap::ZoneMap( QWidget *parent, const char* name ) + : QScrollView( parent, name ), + pLast( 0 ), + pRepaint( 0 ), + ox( 0 ), + oy( 0 ), + drawableW( -1 ), + drawableH( -1 ), + bZoom( FALSE ), + bIllum( TRUE ), + cursor( 0 ) +{ + viewport()->setFocusPolicy( StrongFocus ); + + // set mouse tracking so we can use the mouse move event + zones.setAutoDelete( true ); + // get the map loaded + // just set the current image to point + pixCurr = new QPixmap(); + + QPixmap pixZoom = Resource::loadPixmap( "mag" ); + + cmdZoom = new QToolButton( this, "Zoom command" ); + cmdZoom->setPixmap( pixZoom ); + cmdZoom->setToggleButton( true ); + + cmdZoom->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, + (QSizePolicy::SizeType)0, + cmdZoom->sizePolicy().hasHeightForWidth() ) ); + cmdZoom->setMaximumSize( cmdZoom->sizeHint() ); + // probably don't need this, but just in case... + cmdZoom->move( width() - cmdZoom->width(), height() - cmdZoom->height() ); + + + lblCity = new QLabel( tr( "CITY" ), this, "City Label" ); + lblCity->setMinimumSize( lblCity->sizeHint() ); + lblCity->setFrameStyle( QFrame::Plain | QFrame::Box ); + lblCity->setBackgroundColor( yellow ); + lblCity->hide(); + + // A timer to make sure the label gets hidden + tHide = new QTimer( this, "Label Timer" ); + QObject::connect( tHide, SIGNAL( timeout() ), + lblCity, SLOT( hide() ) ); + QObject::connect( tHide, SIGNAL( timeout() ), + this, SLOT( slotRedraw() ) ); + QTimer *tUpdate = new QTimer( this, "Update Timer" ); + QObject::connect( tUpdate, SIGNAL( timeout() ), + this, SLOT( slotUpdate() ) ); + QObject::connect( qApp, SIGNAL( timeChanged() ), + this, SLOT( slotUpdate() ) ); + QObject::connect( cmdZoom, SIGNAL( toggled( bool ) ), + this, SLOT( slotZoom( bool ) ) ); + QObject::connect( &norm, SIGNAL( signalNewPoint( const QPoint& ) ), + this, SLOT( slotFindCity( const QPoint& ) ) ); + QObject::connect( qApp, SIGNAL( clockChanged( bool ) ), + this, SLOT( changeClock( bool ) ) ); + // update the sun's movement every 5 minutes + tUpdate->start( 5 * 60 * 1000 ); + // May as well read in the timezone information too... + readZones(); +} + +ZoneMap::~ZoneMap() +{ +} + +void ZoneMap::readZones( void ) +{ + QFile fZone( strZONEINFO ); + if ( !fZone.open( IO_ReadOnly ) ) { + QMessageBox::warning (this, + tr( "Unable to Find Timezone Info" ), + tr( "<p>Unable to find any timezone information in %1" ) + .arg( strZONEINFO )); + exit(-1); + } else { + QTextStream tZone( &fZone ); + while ( !tZone.atEnd() ) { + QString strLine = tZone.readLine(); + // only pass on lines that aren't comments + if ( strLine[0] != '#' ) { + zones.append( new ZoneField( strLine ) ); + } + } + fZone.close(); + } +} + +void ZoneMap::viewportMousePressEvent( QMouseEvent* event ) +{ + // add the mouse event into the normalizer, and get the average, + // pass it along + slotRedraw(); + norm.start(); + norm.addEvent( event->pos() ); +} + +void ZoneMap::viewportMouseMoveEvent( QMouseEvent* event ) +{ + norm.addEvent( event->pos() ); +} + +void ZoneMap::viewportMouseReleaseEvent( QMouseEvent* ) +{ + // get the averaged points in case a timeout hasn't occurred, + // more for "mouse clicks" + norm.stop(); + if ( pLast != NULL ) { + emit signalTz( pLast->country(), pLast->city() ); + pLast = NULL; + } + tHide->start( 2000, true ); +} + +void ZoneMap::keyPressEvent( QKeyEvent *ke ) +{ + switch ( ke->key() ) { + case Key_Left: + case Key_Right: + case Key_Up: + case Key_Down: { + tHide->stop(); + if ( !cursor ) + slotFindCity( QPoint( contentsWidth(), contentsHeight() ) / 2 ); + ZoneField *city = findCityNear( cursor, ke->key() ); + if ( city ) { + cursor = city; + int tmpx, tmpy; + zoneToWin( cursor->x(), cursor->y(), tmpx, tmpy ); + ensureVisible( tmpx, tmpy ); + showCity( cursor ); + tHide->start( 3000, true ); + } + } + break; + + case Key_Space: + case Key_Enter: + case Key_Return: + if ( cursor ) { + emit signalTz( cursor->country(), cursor->city() ); + tHide->start( 0, true ); + } + break; + } +} + +ZoneField *ZoneMap::findCityNear( ZoneField *city, int key ) +{ + ZoneField *pZone; + ZoneField *pClosest = 0; + long ddist = LONG_MAX; + + QListIterator<ZoneField> it( zones ); + for (; it.current(); ++it) { + pZone = it.current(); + long dx = (pZone->x() - city->x())/100; + long dy = (pZone->y() - city->y())/100; + switch ( key ) { + case Key_Right: + case Key_Left: + if ( key == Key_Left ) + dx = -dx; + if ( dx > 0 ) { + long dist = QABS(dy)*4 + dx; + if ( dist < ddist ) { + ddist = dist; + pClosest = pZone; + } + } + break; + case Key_Down: + case Key_Up: + if ( key == Key_Down ) + dy = -dy; + if ( dy > 0 ) { + long dist = QABS(dx)*4 + dy; + if ( dist < ddist ) { + ddist = dist; + pClosest = pZone; + } + } + break; + } + } + + return pClosest; +} + +void ZoneMap::slotFindCity( const QPoint &pos ) +{ + lblCity->hide(); + // given coordinates on the screen find the closest city and display the + // label close to it + int tmpx, tmpy, x, y; + long lDistance, + lClosest; + ZoneField *pZone, + *pClosest; + + if ( tHide->isActive() ) { + tHide->stop(); + } + viewportToContents(pos.x(), pos.y(), tmpx, tmpy); + winToZone( tmpx, tmpy, x, y ); + // Find city alogorithim: start out at an (near) infinite distance away and + // then find the closest city, (similar to the Z-buffer technique, I guess) + // the only problem is that this is all done with doubles, but I don't know + // another way to do it at the moment. Another problem is a linked list is + // used obviously something indexed would help + QListIterator<ZoneField> it( zones ); + pClosest = 0; + lClosest = LONG_MAX; + for (; it.current(); ++it) { + pZone = it.current(); + // use the manhattenLength, a good enough of an appoximation here + lDistance = QABS( x - pZone->x() ) + QABS( y - pZone->y() ); + // first to zero wins! + if ( lDistance < lClosest ) { + lClosest = lDistance; + pClosest = pZone; + } + } + + // Okay, we found the closest city, but it might still be too far away. + if ( lClosest <= iTHRESHOLD ) { + showCity( pClosest ); + cursor = pClosest; + } +} + +void ZoneMap::showCity( ZoneField *city ) +{ + pLast = city; + // we'll use city and country a couple of times, get them to save some + // time + QString strCity = pLast->city(); + QString strCountry = pLast->country(); + // Display the time at this location by setting the environment timezone + // getting the current time [there] and then swapping back the variable + // so no one notices... + QString strSave; + char *p = getenv( "TZ" ); + if ( p ) { + strSave = p; + } + // set the timezone :) + setenv( "TZ", strCountry + strCity, true ); + lblCity->setText( strCity.replace( QRegExp("_"), " ") + "\n" + + TimeString::shortTime( ampm ) ); + lblCity->setMinimumSize( lblCity->sizeHint() ); + // undue our damage... + unsetenv( "TZ" ); + if ( p ) + setenv( "TZ", strSave, true ); + // Now decide where to move the label, x & y can be reused + int tmpx, tmpy, x, y; + zoneToWin( pLast->x(), pLast->y(), tmpx, tmpy ); + contentsToViewport(tmpx, tmpy, x, y); + if ( lblCity->width() > drawableW - x ) { + // oops... try putting it on the right + x = x - lblCity->width() - iLABELOFFSET; + } else { + // the default... + x += iLABELOFFSET; + } + if ( lblCity->height() > drawableH - y ) { + // move it up... + y = y - lblCity->height() - iLABELOFFSET; + } else if ( y < 0 ) { + // the city is actually off the screen... + // this only happens on the a zoom when you are near the top, + // a quick workaround.. + y = iLABELOFFSET; + } else { + // the default + y += iLABELOFFSET; + } + + // draw in the city and the label + if ( pRepaint ) { + int repx, + repy; + zoneToWin( pRepaint->x(), pRepaint->y(), repx, repy ); + updateContents( repx - iCITYOFFSET, repy - iCITYOFFSET, + iCITYSIZE, iCITYSIZE ); + } + updateContents( tmpx - iCITYOFFSET, tmpy - iCITYOFFSET, iCITYSIZE, + iCITYSIZE ); + pRepaint = pLast; + + lblCity->move( x, y ); + lblCity->show(); +} + +void ZoneMap::resizeEvent( QResizeEvent *e ) +{ + // keep the zoom button down in the corner + QSize _size = e->size(); + cmdZoom->move( _size.width() - cmdZoom->width(), + _size.height() - cmdZoom->height() ); + if ( !bZoom ) { + drawableW = width() - 2 * frameWidth(); + drawableH = height() - 2 * frameWidth(); + makeMap( drawableW, drawableH ); + resizeContents( drawableW, drawableH ); + } +} + +void ZoneMap::showZones( void ) const +{ + // go through the zones in the list and just display the values... + QListIterator<ZoneField> itZone( zones ); + for ( itZone.toFirst(); itZone.current(); ++itZone ) { + ZoneField *pZone = itZone.current(); + pZone->showStructure(); + } +} + +void ZoneMap::drawCities( QPainter *p ) +{ + int x, + y, + j; + // draw in the cities + // for testing only as when you put it + // on the small screen it looks awful and not to mention useless + p->setPen( red ); + QListIterator<ZoneField> itZone( zones ); + for ( itZone.toFirst(), j = 0; itZone.current(); ++itZone, j++ ) { + ZoneField *pZone = itZone.current(); + zoneToWin( pZone->x(), pZone->y(), x, y ); + if ( x > wImg ) + x = x - wImg; + p->drawRect( x - iCITYOFFSET, y - iCITYOFFSET, iCITYSIZE, iCITYSIZE); + } +} + +static void dayNight(QImage *pImage) +{ + // create a mask the functions from sun.h + double dJulian, + dSunRad, + dSunDecl, + dSunRadius, + dSunLong; + int wImage = pImage->width(), + hImage = pImage->height(), + iStart, + iStop, + iMid, + relw, + i; + short wtab[ wImage ]; + time_t tCurrent; + struct tm *pTm; + + // get the position of the sun bassed on our current time... + tCurrent = time( NULL ); + pTm = gmtime( &tCurrent ); + dJulian = jtime( pTm ); + sunpos( dJulian, 0, &dSunRad, &dSunDecl, &dSunRadius, &dSunLong ); + + // now get the projected illumination + projillum( wtab, wImage, hImage, dSunDecl ); + relw = wImage - int( wImage * 0.0275 ); + + // draw the map, keeping in mind that we may go too far off the map... + iMid = ( relw * ( 24*60 - pTm->tm_hour * 60 - pTm->tm_min ) ) / ( 24*60 ); + + for ( i = 0; i < hImage; i++ ) { + if ( wtab[i] > 0 ) { + iStart = iMid - wtab[i]; + iStop = iMid + wtab[i]; + if ( iStart < 0 ) { + darken( pImage, iStop, wImage + iStart, i ); + } else if ( iStop > wImage ) { + darken( pImage, iStop - wImage, iStart, i ); + } else { + darken( pImage, 0, iStart, i ); + darken( pImage, iStop, wImage, i ); + } + } else { + darken( pImage, 0, wImage, i ); + } + } +} + +static inline void darken( QImage *pImage, int start, int stop, int row ) +{ + int colors, + j; + uchar *p; + + // assume that the image is similar to the one we have... + colors = pImage->numColors() / 2; + + p = pImage->scanLine( row ); + for ( j = start; j <= stop; j++ ) { + if ( p[j] < colors ) + p[j] += colors; + } +} + +void ZoneMap::makeMap( int w, int h ) +{ + QImage imgOrig = Resource::loadImage( strMAP ); + if ( imgOrig.isNull() ) { + QMessageBox::warning( this, + tr( "Couldn't Find Map" ), + tr( "<p>Couldn't load map: %1, exiting") + .arg( strMAP ) ); + exit(-1); + } + + // set up the color table for darkening... + imgOrig = imgOrig.convertDepth( 8 ); + int numColors = imgOrig.numColors(); + // double the colors + imgOrig.setNumColors( 2 * numColors ); + // darken the new ones... + for ( int i = 0; i < numColors; i++ ) { + QRgb rgb = imgOrig.color( i ); + imgOrig.setColor ( i + numColors, qRgb( 2 * qRed( rgb ) / 3, + 2 * qGreen( rgb ) / 3, 2 * qBlue( rgb ) / 3 ) ); + } + + // else go one with making the map... + if ( bIllum ) { + // do a daylight mask + dayNight(&imgOrig); + } + // redo the width and height + wImg = w; + hImg = h; + ox = ( wImg / 2 ) - int( wImg * 0.0275 ); + oy = hImg / 2; + pixCurr->convertFromImage( imgOrig.smoothScale(w, h), + QPixmap::ThresholdDither ); +} + +void ZoneMap::drawCity( QPainter *p, const ZoneField *pCity ) +{ + int x, + y; + + p->setPen( red ); + zoneToWin( pCity->x(), pCity->y(), x, y ); + p->drawRect( x - iCITYOFFSET, y - iCITYOFFSET, iCITYSIZE, iCITYSIZE ); +} + +void ZoneMap::drawContents( QPainter *p, int cx, int cy, int cw, int ch ) +{ + // if there is a need to resize, then do it... + // get our drawable area + drawableW = width() - 2 * frameWidth(); + drawableH = height() - 2 * frameWidth(); + + int pixmapW = pixCurr->width(), + pixmapH = pixCurr->height(); + if ( !bZoom && ( ( pixmapW != drawableW ) || + ( pixmapH != drawableH) ) ) { + makeMap( drawableW, drawableH ); + } + + // taken from the scrollview example... + int rowheight = pixCurr->height(); + int toprow = cy / rowheight; + int bottomrow = ( cy + ch + rowheight - 1 ) / rowheight; + int colwidth = pixCurr->width(); + int leftcol= cx / colwidth; + int rightcol= ( cx + cw + colwidth - 1 ) / colwidth; + for ( int r = toprow; r <= bottomrow; r++ ) { + int py = r * rowheight; + for ( int c = leftcol; c <= rightcol; c++ ) { + int px = c * colwidth; + p->drawPixmap( px, py, *pixCurr ); + } + } + + // Draw that city! + if ( pLast ) + drawCity( p, pLast ); +} + +void ZoneMap::slotZoom( bool setZoom ) +{ + bZoom = setZoom; + if ( bZoom ) { + makeMap( 2 * wImg , 2 * hImg ); + resizeContents( wImg, hImg ); + } else { + makeMap( drawableW, drawableH ); + resizeContents( drawableW, drawableH ); + } +} + +void ZoneMap::slotIllum( bool setIllum ) +{ + bIllum = !setIllum; + // make the map... + makeMap( pixCurr->width(), pixCurr->height() ); + updateContents( 0, 0, wImg, hImg ); +} + +void ZoneMap::slotUpdate( void ) +{ + // recalculate the light, most people will never see this, + // but it is good to be complete + makeMap ( pixCurr->width(), pixCurr->height() ); + updateContents( contentsX(), contentsY(), drawableW, drawableH ); +} + +void ZoneMap::slotRedraw( void ) +{ + // paint over that pesky city... + int x, + y; + if ( pRepaint ) { + pLast = 0; + zoneToWin(pRepaint->x(), pRepaint->y(), x, y); + updateContents( x - iCITYOFFSET, y - iCITYOFFSET, iCITYSIZE, iCITYSIZE); + pRepaint = 0; + } +} + +void ZoneMap::changeClock( bool whichClock ) +{ + ampm = whichClock; +} diff --git a/core/settings/citytime/zonemap.cw b/core/settings/citytime/zonemap.cw new file mode 100644 index 0000000..8e8625e --- a/dev/null +++ b/core/settings/citytime/zonemap.cw @@ -0,0 +1,21 @@ +<!DOCTYPE CW><CW> +<customwidgets> + <customwidget> + <class>ZoneMap</class> + <header location="local">zonemap.h</header> + <sizehint> + <width>200</width> + <height>200</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>1</hordata> + <verdata>1</verdata> + </sizepolicy> + <pixmap> + <data format="XPM.GZ" length="220836">789cc4bd59732acbb2adf97e7fc5b6936fc7cab87492d0433d8010926804089080b27ac88ebe134280b87fbe32638ce19a6beeb99add9d5a662ce6a7c88c708fc6c33d2232f9dffffdb761a7f5b7fffedfffebe3e01fe6e1dfc299bfffdb7f479febf5d7fff3fffedfffe77ffd57319bfd5b3ef9146e8ab77fcbffd7fff5bffe2b5efd2dfc9b974dfecb95525e44e2422ee5c9855ccc65533ebd8bf3b729875b7229ebd2a3a318d7cf3e8d5dfe5f6571dea5c7afe410f7af8bc6eefac9ad18f9357c31cacfdf890b906707ce65915fb83176f9f94731e4095a62c8f3f5252e3afdf7757291fa7d8a71bf7f12e3fe69c6d8c913293fd6cf639b4c7ddfa94f9ef2762e62dcdfa2fe7996ff1e93999fff2246f977ca8ff9d73be04216f537bf729cb40eda777c12177dd7fea1f8caf58fca1759fae87ab6e79331d26b1931dae3b224b3fd3eafc5b8fec8eb13fd5c7e777531d20f7b32f56d04c6eefa774f0c791e28bff47f8ac428ffebded85ddfbe88517fc505b8c0fef14efd0b6cef21f52d509e1af529b2fd9e8664b657be9272dadb6e02571f5532cb3b9fc5688f55518cfe57f900ab3f444b31eaf7ae29c6f5d32399fdd1ff2497907ff799ccf2a38e18e9770fc62effa78cf8caf58fa82dbe29a4bc2517285f6743667d753ec428ef93e517d47e9f625cdf1f8a91df23f52bb0fdb6bcbfc8f15a2f90d91ec7bab1cbefd5d99ba47766216fff815c447fbfb4c9ecafc1b318e9eb0199fdf5b417a3be465931eae775042eb03d8e1199fd79fb48a67efb3e99fa95a762e8b7db8a311e7b336357dedd0bb8c8fa3ffb648ea7cd5c8cfc8e2cbfc8fc87f7c6eefee731f88af662ccf2afae50bf634f8cf4418e7c8bf4b91b0f496f65fdeef364d6e7ec400ec1bb5bf1b5d32f5c830b6cdf55498cfa0eb262d46fdeae477d2c9be2926bef498e2cfbfc2a467ecd8bb1d3ffe5598cfade7e92695f170f62dc7ff4c490c7ff3276f21cb662c817eec9acff9aee677f6aec8cd1ff250fed41bd2c867ccd1e58e321781723bfcbabb1cb2f7b12633ce47c63679fe603b2fa6b20863eed2299f3fbfc057cc5f2f76fe42b8ce7f1907ccbfed42247485fa2fd6ef325b4d7eb52ec872e7f31f51d42bedb02e7abcbb318fd677c11431fbf452ea2fe665b31daa3d7155f3b1eb7c5a89fc998ccf17a1f89519fb58618f9573fc590d75f1abbfc1f4e62c8bb7e11df165d7ed287ed9fff12b37f493fd647e1d118e369042e72fcdec762dcffd03646ff7c27d3bf6bb4c4283f5714e3feac5dcff1bb13439f0af52fd29e6f2b62ce376763cc5f3d31fa6bffc518f3cf5a8cf2ee2c3fe87fdf21d37eeda53fc7d3b96aecd2fb3531f2ab2dc0eabfc7bc31fc939218f9ed8de91fde18bbfc3edfc8579cef5a62da8b1cf916e9eba518e9f7ec1fc9f8807da53cd7b7b0e74d967793a37d873dba2d91974e9f424ef351ee0e2c7b38fe22b3bdf22d31fafbfc22be75e36fb323b3fe274f628caffb1e59e373658cf1d414a33c7f61ecd2bf1ec5287fb314633cec299ffaebcbbd18e575dec5cccf23d3befb6731eba320863cab1732fbdf626fecda7f7d25a6fdd818bbfcfa1f62c8b31818bbf4e1b318f59fdd92d55f2f629457cd89515ed03486bd2a8b51de970f56ff3dec8c317e4a62e4df198b917f3f34c6789e8a39ffb1bca43fbbfbcbaf62e457dc88694f1662dcdf7e23df223dbb16a37e3e1fc811f27fa988391f37c490b799055fe738be57c6eefade0d99e3affa64ecd2eb7932e7a3cdd418f395f2e7f83c3e19bbfb47ecafd71c9fe399b1bbbf5e13e3fe11fbd74d0ee9a79e98f690fade50de25fa5f321f603c0c2fe2921b6fe793d8c77c31100791ab9f2999e3697c3476f767ba62f4c7cca331d2db62e437e1fd45cdaf6763d77e83b118e5f9cfc6c86f224679a33b63971e0562ccf7719dccf925c888517ef7c1d8a537d762d8ab7841e6f89decc4e86f8b9518f9554fc62e7d9b17439fe6bb18f2175ac64efed72b31ecd52514a37df60d32c7efaa20863ce70f31e4d9bd1a43de9298f659f2b3fd96185f361fe52fc6b0876b31c6636b650c7b722d46f95bb6b7c6f7c78d18f9750a62c853a1fec9fc85f58a8198f14f598cf20f4d63979f7f1053ffa5b14b2fb3fe641f4e2531e381ba31e2b7bd18e5bf9d8c919f2f663cb53576e9ef3931e429d8f590675704cbfebc1f8d5df9ef1331ca7fef1ba3bd59dfb24fb5b531fcc90731f22fb3bdae599f77436397df3dc7a3eccd7a21a6bdbf17633c3e4462f49f0ae54bec11e2c71b31eedf5d89517ed41523bfda1799fe7ef149ccf58dbc31e623d66f89f670332353df8cabcf624ef627d304cb5e3c8ec5811b5fc32199fe4bcb1343bfe1abb1bb7f742546fea3aa38bc725c3176e9f72a8ff6e1fc2986fe8b6731ed5bd118eb3d2d31ec43612b86fc930f31caafeb7ada87cd468cfed8ac18bbf4ee488cf2a3508cf21a0531ec6b9007cb1e043963f847cf629417978d31fe2331ed37e54fec03e6e32f31fd938cb1bbbf5210335e507eb4276fc6b09f31f595fda8768c5d7e4f9e18f9b5b3c6f02fba64da83cf8231c6f3b598f2b68c311f283fda83d39331fc61e6277b305b8b51defad618f3d94e8cf2f63d6397fe7625467945df18fad4c8b4cff3be98f167c918f1f1b598eb056d63a46fc5282f627b5f331e69f48c5d798d8a18e50d76c698af2c1de5ad2363ac8f497edaa7ea8d18f9dd53be1bd667361623fd301263becfefc4e82ff7d447f627ba1323bfe154ccf9a16f0cfff54b8cf19d3f8b31be6ab44f37f40feb0f62caa7f26e717dd113633c360332ed75f1d118fea5f4e3fcd6b812737e57fd44187ffb15b844fbfd702346fd36698f4ab4bf8f0531e793580c799f395e4b6cffe1814cffb6037bebcb3f5a6ec8f44f964731f25b3c8961ef6a2fe02bfa8b8b9698eb757563a7dfa426e6fac84c8cf6def68c5d7f187d91d9dfb77d63f43f4f8cf2efb3c6aebcbedd8ff2e67931cafbb4fc505e7b4d66ff6e9dc418af7e594cff2d678cf9f355ccfabf18bbf4fa500c79a662daaf73490c7d1f3bc6981f76628ceffed918f6682ca6fdcd19a3ff5b79d0dfbf13a33dc377b0ec59e7468cf28e6b6357de692b46799f763debdfae67bcc3fa90bd9b94c4286fd33346fb0ec528fffdda18feeebd18e53f7d89d19ef94f32edd97e2c4679ab9331e64bc9c3f9e7e1da18f347284679bb8db1d3efae4066fb859fc6eefefc8b98f7bf1bbbfb3f31bff8b297f1b3b1abafaf8398fee83763fe7c12a3bc6345cc78ef468cf243d687fcb946284679fba198eb612731f4eb7a62e47fe6f8be617cfdd21353fe6b31d7ff2231e47d91fcb497cf6f625cfffc29c6f54ddaa712ebeb6e45e6fcf034216b3e72ed7b95bfca46ce3f1b3f92af30ff4c3ec5180fab5bb2e297ba98f62663ecda6fd613737e991bbbf481e587f13f691bbbf25f2f62c69b2f62f8b7f72199e37d267dd87fee3d31caef67c52caf2c46fe830fb0c6737d2ea63f1c8b915faf600c7bd71523bfcb82ccf1bb50feec1ff74fc6b0af0731eab3f3cd287f2d66f9ef6294b710733c4f8bc6589fef8b693f32c62ebdf12a46f92bc9cbf63b7e193b797a3b31fd7fc9cbf60a57648effcac518e3b322a63f3e32c6fee4b318f21c0ec6aefc4a550cf9ea963fe4c9bf8961ff2e1bf00dedf9dda331da672ce6fa69d618fed3a718f294236327cff3448cfac90fc428ffb545a6fdd8dc88399fdf19c3ded7c590e775658c78632ae6fa54d718f1a49547ff91f5237fae5531c6fef78b18f2bcbd19633e6e8821cf8be507791eefc5ac9fa5b19327d713a37e3e9b64dab353518cf29f7d63d847c9c3fef261d7a3fc07f61ff9877151ccfaa47eb2879db5b1bbbefd24863c837731e43952bf12ebeb59e5d1dfafefc448af703cdd529ea1f34fae7cad5f16cac6ae3e4e186fbef63b1f037211e943d8b3c45f427f1aeec488e7c71531ec793e43a63f1d6fc48c9f4762d8f75cde18f6f54d8cf8fdb162ecd26b4d31e70f8c8fc4bf613c70670c79d762f4c76a568cfca65762e4b76a18c729cf7d32c747b32c467dd6d7c6580ff2c4b00f87a118f2bd3e1b637c7e89215f6360ecd2572331ea672ef9af503f8b83b14b7fb1f220ff94f529fb3b51791c1fd5400c793b4fc6586f517dd2debec6c64ebeeaad18f29f25cf2de4dbb2fd656fcf7b63579fd38b18f5592d1ba37f1ec5902f181a23fd2c867cedb1b1936f9f11a3fe16ecbfb2bf93be98f1455b0c796adfeccadbedc59067766decd2975762c8336b183b79165f62b4effb8d18e321df3376f2166a62d4e794fac97eafbac6384f9017a3be1f8bc6f0bf6fc5d0efc3eea77e6731fb6fce18fed38318fab50231f4c95afe90f7783176fa5ceec9b467ad500cf94fb118f25feac6f08f3ec4dcdf8c8ce1afa83cf6e77ad3d8a537d47eecaf5bbb9ff3b5da8ffedef3540c7d6a4b32e7878bca63ff8e9ac68857aa62c81b6c8c317fcfc45c5fb5eb59df9f62d477e5510c793fd93f35ff349ec5a8dfed9798f349410c799f6f8de1ff0762c8fb7e67ece4f9b0fb216f8efa6bfde36d2846799ff7c6f0bfea6294ffd533c67e41438cf21a2f64add75f89e9bfb48cd13fec7afa9b4d63cce7b4a725b6d733ede92ded418de3f196fa3429ef2de7dbb9f3afaff3852cc67324e67e593e47e67ed5b04fe6fc5bb936c67ac42bb8c8fc864d32e7df684fe67a75b56a0c7fae2fc6f54103acf5a071991c613e58eec08a2fee1fc5b03ff737c6aeffe70662f4ffea511cbbfcf20fe2c9b52b4fd7737eabf5c4a88fe9b5b14bbfbf13a3fc59d7d8951f4dc5283f776becd2979118f3f773ded8c937d88863275fa6638c742b1ff2df0764da8ffb9131fcc95731c6e36665ecf479cc89a1effcc9d8a5676a62e85bb5fca16f752886beed8131fc15b517fdad85c90b7ddf2c7fe8b3527bd2de743c31f45b3d1bbb742f2b867ee7576327ffb42a66bcd93746ff95fef4efbc0f63277fe524a6ff3213439fb7a618ed3565fd68be1e5dc45c6f2b88b9fe7934c6f9bba998fe83e5477d8b62e8eb5d1bc3ffda8ba16ffbddd8a57b563ef4dbc762b457ff534cfdd85e9a8fe32731e5df1a3bf9b6c6943f3276e987ba98f1f0c2d8c9773c8bb9defa620c7fe44d8cf6f237c64efe9631daaba8fae0785bdc1abbfe77c7fea0f97c951743df554f0c7d2f0d63a74fa8f6e0f87b2f19bbf4aeda93e3efd9ee87be33d5a7e6f7b531faaf950ffdcaa198facd8c5dfa4cf5cbf1f6207d38ff871f629eb72d18bbf4f9ab98ed7b3676faac3b62e8bbfd6697feaefae578dc59799c6fd43e1c7f0f8f62fa2fea8f1c6faf596397fe3e16a3fdb607b0fc85cb5c0cfd5a37c6380f711443bf46c318e7453fc4d0efe3d518f6a82b867eef5963a74f6e21467be6fa62e8f769d7737e90fc5adfb81863fd50d7d3ff58bd1a63bff045ccf3f8beb193b75516733fe69b5dfa5b550c7dc61b31c6d785fd53fe4aa323863c77256397fe2179395e1eed7ec6e7d762947fbc13a33fbc7c8a517ef662ecea6f7345667f0ed49e8ad7dac658ef903eeccf7ecfd895ff247dd87f2f0531db8ff2dc72fd7c743086ff7f25e6f996b331d6d32d9dfbd33563eccf64c4f4b7585fb73a5f3711f3fccede18e70b8b62e49fa3fdbde5fa79c513f37986b998ebf10b63f8a32a8fedfbccf6b9657d6f385e7dfa9bf74d63975e647f0af2e0bcf3a7affd02cf1fe4eb62b4ef06f2fa3a1ff6be10a33f0e46c6eefece5c8cf6293f91b9df38ee8bb91fb8045ff13c5a2f4fe67c7d0f797df98ff70531c6e77d8dccf965f22246baf765ecd2dfd662d8dfcc590cff2df32186bff3726b3c71f989393fdc17c55c7ff78de19f3d8b519f998531cecf2cc590d77f3086be5762c85bf58c9dbcf70331fdd19d31f4998ba18f7767ecf499bd91391f9c6ac638af771143bfcc9331f48bc4d4cf37867fa6fae57c31088ca15f570cfdee87c64efed5b598fa79c6d0cfe4837ebec90ffd0eb027b65fd6bd16a33f7a2531f48fdf8db19ee68ba17fab6decd2cf4731fdd3d818f14e530cfd5b9fc6a89f8d18fa2f4363c457961ff5bf3346bc712586fe01fbaffcbfd6d118e7117262faeb1563f8af7931fdf5a1319ef7b0eb511fc1ab31fc5be9cbf969723676fa7a563ec7e79531d26fc4a88fc9bdb1d3b75f15a33e9acfc6f037381ee40f7edd183bfda696cef3753963f817d28ffea0bf3676fa15240fc7fb7a2786bee599b1d3e7a8f6e4f85ecc8d5d7a57f5cbf9f0291043fee3d218fb731d31e4df378da1df8b18f247cfc64efeca560cf93f4263a4ab7f713c1f8fc658efec8ba1cf8767ecd2fd9518ed377b3446fb487f8ee715f591bf57a918c35fbd1243dfa7ac31d6e75ec5d0775b3476fa743fc4dc7fb5fb793e2410439fd5d8d8e9f33115d35fbf3776faecd87ef20f271b63cce77d31cfcf7e33d68f5a62ae9f8e8ce1efa83eb47e1a19bbf4e68b18fa772fc6b05f763ff47fde8bd19e6f0731f47ffb32c67a7153cc788cfd49fee649f547ff72a3fae3f88bdf8c115f4ec4d0c7df1a63bd6925863e8f9eb1d3677c27a63e2763977e772b46ff7d793476fabcaa7d381ebb0563d863da07f35f553f1c9fb1a543bfbb8bb1937fa3fec8f179ae18c39f55ffe1f8fcb2fce83fa97d383ef3ea2f1c6f35d68ffcd5cec9d8c9b7bc1143bef3c418e3e9494cfb5733c6f9db0f31e45b5b79a8cf915d8ffaacefc590ef8ef3abfcdffd42ccf3465d639c3f398a21eff3bd31e21fc9c3feff7230c679a48a18f595b5fb21efa3e4a37f1d5f89215f762a66bc5d35c67e82ca677feede18633ea57dbee57e6f2332c6fea9e461fcd3fa32463ca6fcd99f3a7d31e3db9d18fdfb8bf6d3677cf37225663c7a234679839931d6a375bdcff3596c4f3fe6fe09fdcf20cfe78356c6989fdec53cff4afd826bdc7f6c8a717f3143f6915ea07d0e59de4b4bccf354ae7fde140a3c6f1dafc18a27c64fc6f037b6e422c74b955cc2787a3883751ed1cf80e54f67b662aed7de1b3bffb1f946e678ed1e8d5dfebe27e67eb05d4f7ff8da18fefe49ccf82527a6ffdb37867ffb29867fe33d8821efee60ece49de4c15acfdcecc5a8af7d470c79b63531e41996c590a7d617331e7b3576f254c762c893b7fc204ffb83ccf968198821cf6c24467d457363c407d762c837793446fa8b18f5e54562c6074331e5b3fb21dfb04ed6788fc5b4975331c6e340f9717eda958c31df16c4e80fcb6fc6faa8cae7fc346f183b7d1ed43e9c9fc6563ef4cde5c45c2ff5c5689f8f8998faf5c85a9fff32c6faa8e467ff5e6d8ce11fa97ed9bf7b4363e823f9d8df3b3b63ac5fcfc4d027affa657fafd8f5907fdd1543fe39e5977f383b8ab91eb13176fa7c3d89793eae25e6fec2de18fb495931e47f3a18637ff924a6bf1b19c33ffa14439f4f9307fdb17511a33f76696fe4efc58fc6f0df953fe7b7695f0c7d1e0ac6183f4531d7a7afc41ccf763de48bdec99cef9e0ac6d8ef577d71be9b0cc5dc2f981863bdf54e4c7f6d61ece42babbd381e4e5fc6e83f963fe47d2919e3fc89e50ff91bba5ee7eb1ec47c1e73618cfd8e9198f1d2d118ebe5ea2fecffadb3b193afaff2b5deb833c6f904e9c3fe9d7d31c67e00eb53eb8db97b31f72ffa62c8bb7a1343dec7a1b14b1f5f8bd91f2c1df2be5bfe90b7f821e6fafd4accf5ed8918f53ba81bc3beb37ee5af2d6a62eee75b3ae41f7c89e9bf2c8d719ee9564cfbb936c6fa63560cf99fba62c87f67ccf5b29d31f42b88a1cf59f9b1bfc73d63f82b1d31cfbb4f8cd17f6231cfdf968db17f24fdb47ffb4c66ffdc287ff6cf8f6fc6790dbb9efeed8731ce178ec5c8ff692666fd70be97ff1766c55c6f7f34c6fc66ccf78b648c711ea32c863c5f9c6fb47efc5917c3bf8bee8d71bef241ccf39e7b63f8bb5b31cba7bfe6d33f0c5fc5c87fd43386ff6ad723ff5a854c7ff2fe5dccf74f7c1843be404c79289fd6c3bfc662dc5f8b8de15fefc4287f78678cf579b667e20fe3bcffad31e45b8af93c41608cf66988f93c23fb8bfce78bf263fdb4aac6b0dfecff01eba3bd11f33c6ac518f549f943ca538bc4283f5b15a3bd5e381f862cff79610cfdd9bef2efebf762e6ff6e8cf3a9b48f11ebbfb210b3fd56c6d8bfa07f1851de16fc9f40cf671e2e64ee2fcc72623e3f9a3776f622467b047a9e69d41463bc953b628cb7d950cc78b860ecf2fbba8839ff62fe09142f54f262fa53960e7977a8ef40e709ca1731f79b3d31cfd754c4f0979edec8b4bf5f0d31ca3f18339e2a1abbf4412ca63e2732edddf051ccf3634363777f3d2b46feaba918f22e3d63f857be18f3cda22386bfd46b8ba15f7541a6bdcc758db11e3013f3f9b01b31fb83e4a3bfbafc3476f2b4fb62f6976b63977eda8921df51f5c3786cd43176f2be515ef9a7872731fdb78198fd2b2fe6fa6b60ecca5f5dc4906f5e1073bdfc5dccf5d59d31d6cf7362c8b7bb27eb794a95cffe135e8b21efae25e6f31a7563f81f2b31e47fed1863fdf8538cfa0c6fc43c7f3d31c6f923e9cbf57edfca833ecf3532e7ebd3544c7f6f6e0c7ffa20a6ffd13676f2bf8562aeefbf19c31fb4fcb9be5830c6f987ad98e795d51ef45ff77b63277f4ef5c3fe5e3079d09f9aca9ffec2e224867e6f5d63ac2f8ec4d4cfd2795e58fd91f667d234c67a86ea8be3e1f52c663c7a30c679fdaa98e7e54ac64e9ff64c8cf67b817f1ce879829d31f73b1662e8170f8dd1bef762e8f7b932c6f3f33331edeb9731d68f6fc568bf879a31f4198b19af8e8c11cf9ec4d0275b3476fa76389eb5de59e889b91f1719e3f9b28c98fef2ad319eafec8b391f7d33eced9d98fbed8131e2938e98fa9a7cd0efa966ecf46be4c41c8f961ff43d5f91e94f8f545ff49f0b96cef3a85531cf23d9f5d06f751043bfdec018eda9fea0f5feb531da53fd81e36f581243bffeab18f27faa3ef4bc56cb18cfd77c8a795ebf680cfb3111733faa678c7840fd8fe3ef2536867d947e1c6f4f8f62c8fb7a30c6fac2458cf668523f9fef276a5e89b9df742366fc712de679b1ac31e20bcb8feb4347633c7fd015f3bcc7ded8c9dfea8bb9feee89a1cf82eda378e0f0628cfd154be7f9fb9231f683a40fc7c7a0608cfa0ec55c9f957e1c0f3dda6bc513355dcff8615331863c65319fa7bd18bbf2da6731e469f58c71fe99f3ade28f42648cf85ff2c58c1f1e8cb17f732be6f382cf623ebf583576e5bdb27cc52f8d1b31e38bbe31e2b72731df57f2688cfe5315335e7d37863ffa4156bcf0698cfe561723fffdab31e29f9698fbf3b4ef8a67ee1bc688873a62be8f6426c6fd7bda03c5371fe490fad5ee8df1bcdbbb98ef8bca19633f55d753bffbbd31e2a5a998cf9b4ec45c7f3266feac0fc54be76763777ff54acce7693f8db1df62d723bf06fd03c557e79698ed7130467d6fc49c8ff262eeb7b3be156fd53e8ca1ef59ccfae4f850fc1586c6e8bfae7e4b05bdef21f0c08a5f66af62cc47ad67639c8fbd256bfcbe8879bee2ced85d9f3f92399f94951fe78fe1580c7b34a819e37c7c48a67d7edb8a517e67224679870fb09d2f35c6f587d818fb1d2b31e46f54c590a77b25867ddf505fadff56e7629e4f6e89b9dfb51723ffb7ba31e2ab408cf25a3531e6c3b7bc31d6a7253ff74b961963172f2cd97ef2b7834f31df0ffb24e6f37d2531e47da919239eb574eefff8c638cf771043fe51d9d8a50feec58c7f4ec64e9f99da87f3ffbc6a8cf8c2ca837ef91b32e7fba331f4db14c43c8fa0fa627f99178db1fe5d1143bffec518e72f4662e8d7537b73be5f34c4907ffccd4efef2408cf67a0e8d9d3e5f6c7fad3f9f2662e853be32c6fac7548cf61b6e8c11ff95c5d07763f943df7a45ccfdf76b63ec6ff5c43c8f69e5419fd149cce77f3ac64e9f40f2d21fd8dd1943fe9c98effb8bc48c577bc6d81f2e8ab91f373286ff3513a37d0ab131d2f762b4d7e3c0d8e9f3d21733fe3e88a15f2cf9399e9aba9ee3691e1be3f993b618fa2d6bc6787e6f2ba6fddc1b63fd49edcff1f6fc688cf36a9f62e89b0b8cb1befe2586beaf3b638ca7b318fdf5f4608cf1d81443ff3ec797fce9eacc18cf47a93de84f6faf8d11afbe8b799ead668cfa507fd07a4fdb18e7fdd55e1c7f4f1fc68827d47f381e2fea2f1c8f17bb1ffa4d694fe57fc75531e6db75cd18cfb3f7c55c6f3919237e1a88a1ff62648cf67c10f379efb5b14b0f8f62e897ad1b3bfd1e8dd17e4dda0f9fef17f8ba15439faae4a5bffed236c67eb2f4e7f8dc9c8d713e6a28e6f922c9cbf1f9b61743beec9d98eb27d762c6a3eceff2d78307639c9f1b8be93ff78db1dfa1fc7dcee779639cf75c89f9fe09da2bf9eff5c018fea0e493ff9e37c6fa4543ccf79f548db17fd613f3f9ab2f633c1fcff947fefa7d5dcc78b5668c78a522467997a1b14b2f1cc5b4f71cfff2e7ab5b31cffb948d319f34c5283f9b35c6f87d17f37d6b6c1ff9f3e19398fb892f62be6f47e5b33eabaccf90fa9ee7c6789e6626e6f9b6b531dabb22c678a8b17f87d4ef60ccf5a8d818fb811331df8f427f28647f7bac8939bfd27f927f1ef68c71fee95dcce743a98ffceff642ccf7b7b9fd8a52a0f3451bdc1fc83f1e3c9275fe64648ce72d9ec57c1ff14a8cfa9864c95adf288a917f1018c3ffd6fdb49f6d95cff5bf9c31c66b07f565ebe1cb3b31d7bf6fc4f41f66c6785f8531fdc18631de173a27737e3f0cc4cc6f698cf52e4f8cfc56763ffc8dbad2391f6f32629e2fae89f9bee7b131fc8b4f31caeb34c5286f3c32867fa4f2395f5eec7aca5322b37dc62b31c66f363486bdb888198f497fb6e7d7560c790e960e795ea50fe7bfc6464c7ffa564c7fe6cbd8c9ebb3ffc89f6c8e8cd13e7d31ea2fca1863bd7d2e86bc77964e7fb22b86fcfb6f467d6fc53c8fb316733ddaf2633cf029863ee5b631eadf27eb7d026731f777242fe7b7c137231ecc89393eed7ee83ba988a16ffc618c78a82a86bef3b131c6474d8cf60a4c5ee8f7a0fa60ff8ed83fe46f6627c6983fca62be7fe44b4c7fe3c118f19cea9ffe656e6f8cf5f3500cf9dfe6c6388f782f86fcbd3b63c4a7d29fe3a37d10a3bd06d7c64ebf91cae378e9aabe395e96556327ff7625867e95a3319e7f91fe1c3fdb9cb193bfa7fae6782a4c8cb1ffb511733dd7e4e1f3114331fa676f6decd2d74d31f47db574e85b833f60ebbb8f5331f43d6cc4d0e7b41473fee81ac33fce8b39be26c62e7db71073ff676bece41d5e89a1cf283076e9679397ed773176fae458df7a9e31ae89e94fe78c111f8562ae47583adaf743e5697ec88aa9ffca18fdd5cae77ec2c218cfef34c5d03fdb30463cabfaa4bfda36f9a0fff84d0cfd1f383fcb3f1d3d89217f311673bda9688cf5abb298f6236b8cfd6d4fcce739d87ffc98bf679611733dfc51ccfdc6a398fb350d63945f11f3fc59688cfec6f2e5bf6e2e62fa8747639cff7f1573be6d88f9fe848918fa9d387ee48fb69ac6781f512046790f96cef30da118faf5b7c6aefc665eccf541da8f40fb03928fed776c8b39ff293fd66fdf17e3feb3ea87f5fdd531c6f3b14f62e4978bc4b4c7ec6f5aef6ecdc57c7f6b20e6f83889b95feb8b31fe5ee95fca3f3e3d8bf93c84f267fd0d9662e4f7bc11f379da1d99f5957d12b3fdbf8cf1bc9be465bc753f11b37d551eeb2bbc33c6fe16fb83fce726db27627fb8e37c1fb37e3a6e3cde16e52f2fe762eeef2fc5d0ef6cd743bfd62b59fe7153ccf5e7ac18f662f8cdf03f1a62aecf7a60f9bbbd8a98f1fa8cacf76d348d619fc662dcef378c315fe5c428af51236b3ff545ccf5ea9398e7b32764ce978d92319e57d98b215f253486bf321423ff75460c791e7c31ca7b88c15aaffc5a89b91e9215439ed1d018f67e2c863c9f7363f8934731d74b06c658ef33e6796a9307f24691b16b9f49474cfff864ecf439e97afa831f4363f43fddaff7d72e8d61cf7762fa83d287f351e55dcce7876f8c9d7cf1590cf9a29931d68f3fc9f4ffbeeac6587fbb16f3f99a92b14bdfa8bee80ff626c6882f9a62c8ffe219233d23e6f3d1763ffa7f640cfd661563ac37aafef4fc7bcb18cf47287fae371e8b62be5ff2de18f19cf4637fefbe1a23be7a11b33d1e8de1ff493f8efff597b19377ef8ba9cfb331e6eb8618fa6c3e8d713e8ef561e7779fc5d0a77830863e6b31f4799f1be3f9aaa198fed1d118f173530c7d77df8cf78184623e0fdc3276fa546231c77bd618f391c9cff74fcd8c9dbead2959cf47bc89b9df9635863f178919efbe1a23feb0fb21effbc818fef7bb98fb317363bcdf53fa69ffec9b9dbc15b6afd6232b3d31d71f5bc6381f22fde8ef6d3c6397be1e8bb99eff6a0c7f2827a67db5f2b9be2a7d7daeaf9e8d118fa8be7dc6cb260ff46d5afed0b7fb62ecf49d2a9dfe4db41543ffb6fa0bfd99f6a731f4bf88a16fe1430c7d3f06c64e9fb5e50f7ddfdf8c5dfad3b518fa764ac6d89f517f8ba1df52fac7d0afd33086fdee83b5de5a3988b9de3c33c6f3266531d7977762b46fff680c7f371073fdc3eee77ad242ccf8ecca18e99f62e87b588979fe93fd47fe70bf24867ca78298cf371e8cb11f581733dec81ba37f49de6bc85357f9d78c7fd91e818ff3808357319f8fea8a79de666b8cf8f646ccfda192b193afa1f2385efa6a2f8e97fabb31ce83d37e6abd395b33463cb214f3798d9118e58fde8d713e4af2d03fafb0bee47f3f648ce1af9ec5f4ef3d63bcbfea24e6fb66be19cfbf733cc83f6fbd1be3bcd0a398fb6d0d63c407763dca0fa99ffcf5a6e4657b14cec6580fa37d0819df148df97e9f9298bfc7447b2cfffc4bccfd85c1404cff9dfd39a23c0f185fa1fce543d918eb0f4f628cdf21ec4128ff39b317d33faa1823bd21a6ff60e9183fbd1e99f3c7ebad98fe7dcb18f94dc52c2f30c6fad6418cf2326b63d853ea277f3c3716a3bcc2dc18e53d88595ed518eba10532fd995d478cf11084629477f934c6fc7e14a3fce3abb1cb3ffb2846f979cb9fcfe3327ff9e38da2319eff9b88b95ed83346fcf221a67ff86c8c78aa20e6797d5f8cf2f76d63f84fca8ffef7e39598f6e2cdd895bf1c8a195f05c6787ee241ccf7994b3eb6ffd38bb1936f9317b3bf9d8cd1fe3b32fdeb93ea8ffef5e7cc18f567e990afbc30c6fb764662d6572c867cdebd31fa534e4cf9d6c64ebef53599fe74f54b4cff782be6798b37633cdf501533de8d8d31bf1fc4a8cfd1c018fbef0d31fb7bd118cf877b628eaf8231ceffb0bee52f57c662c667df8cf86621e6f3cf45638c9fb598f1c08331cebb95c5d0675a3746fcb213b33d4263b4475f4c7d4c3ee8d3d1f53a1ffb658cf5d02b31dfe73935c67a5e5b4cffea534c7ff26c0c7deec4d0e7c337c6f33d5d319fe79818bb743f12b37f1d8c9d3e47da57f9c72fba9efef13c23467b1446629e477e31c6fb8aaa62cafb600c79541ff47f5775638c57c947ffd7eb193b7937aa3ffa07e3a531fc13e943ffe0e1c518f62716d3df0d8c315e9ec4dccfce19e3fd458f62bebfe8c118f1a6fa6b0cfdba763df4dbcdc4d4cfe4837e31e593ff7bbc1643dfeabd98cf4f3f18637da321e6feec8bb193bf781643bffac118fe6557cce715d6c6881f4d3eee3f583adf376df9f17d1a2763d833da07ad0f3f491efa47e5b531cefb3d8ae99f558da1afa573ffd5f283bee73b31f4edd48da16f45ccfeda13f3fc5fc7d8c9df7d27d35f9b6e8d619f55dff49fab0363f4cf4f31cff7fbc6783f84da53e3ad610c7b118ab99ef62146fb4cd45fe80f9e6762c873dc18431eb50fc7cb73d718f3a1f4e7786959fe3cbfcbfce56f9727629457b7743effbf14f379afbdb1cbaf45fb2f7ffa5015f37d8a96cef7694cc53c0fbd22b37d7aafc6389ff324a6bdbb21b3be0a2731f72b32c68807d8bfe45f577762969715f3fd87ac2fad8f5796629e47a4bf27ffbb9d1323bd497b16317eda71bed5fa7ac1d58f5fb4f7ede48db11e1790393f7befc62ebd7f05d6fb681ecbc698df7d31d78beec89cbf86b762beefa0640cffe1468cfc875b63bc6ff3410c79f6cf64bdaf53f2d01fef47c6789f654bccf5f63199fe4ea56c8cf396ba9ffaafce609d87290cc57c7ea82ba63fbe3286bf7010d37f7817d37fb0eb595e9bacf3f65b31f7038ac638cf3b10d31fff3046792d31fdb3d018e93331e5d918633f4ae5ebf735243ffddbdec218f654f2b03d5eb2c628af2ea63cb131d2cb62caf365ece469a87cfab7f54f31eaebe9410cf9366b63973eb5fbe9ffdd19bbf21f553ff267ef8d11df4a1e8e97b79d31ce033c81ed7d230331e46d2cc5b06fedae31f6178e629e8fad1a43fe7b31e40dda623e6fa7ebe95f5ecec6382ff229e6f9f88231e2bbb118e51f1f8c117f5dc48cafe662beefbf668ce7338d694f3cb27e6fe856ccf7010d8c11df5f8b21cf3434c67aeb49ccf3e09131d68f1b62aea7aa3e144f7db393ef8ef651cf274e46629e2f53fb319e3a6d8cf1be949d98ed171ac37e4cc5f49f5e8c313fefc58c3f86c6b0b76a5fc5535963f84f64c54beb4731e47ddf8921dfe3a731ce279fc57cff71c618fef9bd98e3e3cd18e3f7454cf946c64ebe90edabf799ec6b62fe3e4a57ccf8efda18f19fca63ff6dc6c6b0877762ae0f748c715eb12de67a68d518f56bf9b3fe0363e8f72aa67e2563a75f41f5457fad2179e8afbdd78d319ea41ffdb5d69331e2d9b998f6aa6d8cf9d3ae67bc5433467a53ccfede31c679348e0fc547a3ad98fe5edf18cfd3aa3fd1dfeb748ce12f1fc45c1fff30c6fa554eccfda97b63c4df7b31edc9b331e2a78218fa4c7d63a74f96f5a5f5fee24accf32bf7c6f00fbfc47cbfc8de18fef449ccf3aa763fcf67f68d616f3c31dfaf66f951fe400cf91f8fc64efe33eb47f14f6d28e6ef53de1a23fe298a793e66668cf6cc88b99ffd608cf315963ff7aff7c6680fbb1efa0cac3ce8737813733d8ff657f14b7d6a8cf396af62ce3f6d31d717d55eecef03d527fb77376fecca7fb5f2e8cfd27e28beb95b1ac37fbe11d39fd989b99eb710d31fac8bd15e05bb9ff11ec75fc8f3e34d63febef49b319eef2c89f97cd146cc78a029e6f319b7c64ede1ae5d5f9a0afac98f19cca677f795c1b637faf2de6fb0aaec45c0fce1be33c8be4e5fb906a2731ec7753f2f2f982e151ccf3d2ef62c6473762ee7f5b3a7fef94f383bdaf742be6fb878ac678beda13f33cedd818cf4394c5dcdf9919bbf2ce3d31e4b9b3fcb97fa5faa43d7bb2fcd11f8ab4ef7a9fd2e5460c799f76c62e7d3a17f3f7cd7bc678bfedbd98f16cdd18cf1755c47cff84678c789cf389e2c7e6c018cf8f9ec58c5ff3c6eefe5e53ccfa9818c35eb2ff446cffc154ccf78744c678fe48f971bde3f322a6ff477b1eb33e5a77c638dfdd11f3f94fdaa398f2b795cefdcbf2ad31f6df0231fb23db2366bcfc7c34c6fbfe7c31ebef608ce79b38de268aafdfc4bc9ef74ff4feae9531ceeb35c5bcde3346f9b48f13ca5f30e6fea7f29ff079ab9c98cfb340ff50ef73babb17f33ce097b1b35ff73e99fea83716c3de2e2d9defcb7916733f0ee3c5f6f75ef362dcbf681be3fcc29798cf23b23cc5b3c19b98e7797d31f29b6cc9fa3d9c9d18f71f0762c6035d63c46f924fe7d5593f8a1f3b67319f17d91be3bcca8398e7350a62c8f7fa668cf5ce8698ef179a18bbf2df597f8af73e32c68827dec5d0a75c36c679e6ba98eb335963c45f961fcfafbf92b5df3612f37cfd8db12bbf2ff9e84f3f2c8c11afeec5906f7e67ecca1f3c8bd99f0ec638bf23f9e94f3ff6c97c5fe4a824e6fbb90ec6989f743fe3c359418cf20f1531e3bf3763b48fea57f160c3d8b5cfe72799fbb52f4b31f707aac638cf2879f47c4f688cf30eaa2ff69f782766fd7c19e379a40f31cf37158df1be6cacefd8fe58211443be6e648ce7f73362b6e7d418ed792de67a52de18fbd76f62c85bf5c5acbfb231d6433664bd7ffe51cce7b7be19fb952531fd918c31d6974662aeeff8c62ebd1288b93fdf37c6fef88398fb61a131d67fa4aff6c376c6389fc9fea4f363eb9e18fa3caec4fc7dc8b331f6a76b62c81fc4c62e3d527bd2ff3d3d1ae3bc9431cfc37d18c31e75c5fc7d9a8131cec3a97ee9ef7cbd8a19efb4c5f4776ec490a7db3386bd57ff617c7627fde81f051d63acff90edfc55dd18f1fd488cfadb4f8d113f66c5dcdfe81ba37e8d21ef9d95c7f5b19e31eaeb45ccf67e36c67933f62fc55b5f6f629edf7832c6f9a39c18f21f8ec688b76a629e2751f98cbf72a131de673016f3bca631df7fb833c6ef2f713eb3fda64731f757a4bf9e67991a43bfae98eb5b9fc658bf5a8b51dff99918f296ed7e3eff7627e6f9f51399fef84bd918ed6fcce7f54ac6587fa888b9dfa4fec0fe5a5f1ac35eb07e159f15dfc5b047b92b31fdc9bab12beffe590c790a5963d8db9218f28c2d3feee7d29ee8bc57f42ae6fedfbb31fcf7ae98bf7f75658cf72b2cc55caf647f533c767732c6f3ea07317f0f6f2de6f3b54fc64ebee2a798cfa7d78c112f4662ae2f778db11e6fe95c9f933c8ce79e1a62beef696d8cf761cdc494f72c86bca79531f6bf2d3fc8d31c1ae3f904b53fedd13de7577bffd2de18f1ed45ccdf5f3f8879be7b648cf1d514f3f7bb1662be0fa4668cfeb21473ffdde4e1fbc22d9dfb3d9c3ff5fea7fb85317eeff043ccf71d0cc4fcfdf42b633c3f5f12f37c4ad918e74b252ffbdfe7c118f1f944cce74bde8ce13f4fc5a8ef06e7b788eb07c38a18f23c7b62c8f3b132863f7027e679d8ba31c64b5b4c7f4cf5a5fe726b8cf77b583a9f0fab19637da42fe6fa2dfb83e2d37ad118e7333b629e876d1ae3fce852ccfeb011d39f65f931dbe7a52be6fe78db18e7874e62fe3e796c8cf50cce1f8a77c317639cdfe578517cbbdf1ae37ce75eccfef126667958bf0827dcdf9ecc8cd1ffca62e4bfec1ba3bd1fc47cbe85f5a97879ba34c6fad8a718f9cda6c6887f55bed603743fd703661363bcff7321667e33633c9f26fdd81f1bdf8cfe217926983f1e4b62fede6cdd18cf4b15c43c9f3e32c679887731cabb3b1abbf216ceff0d6cff785e22eb79d66731c6dbe4c118fbb74532e39f45d3d8dddfd88ab93f7345e67ac0e39d18e9830358f1e87320e6f33f6732fdf3c6d118cf83e87efae7ed480cf97bcfc6aebce71b32e3bb8f7b319f27f0c53c6fd412f3bc94aee77ede712ee67ee39db193ef521673ff682fe67e45df18feaf31dfcf60e5a13e56ef62fa974fc6d82f62fd295e0b0fc64e9edc8718e5ef56c6f02fbec4287f773146bcd012a3fc304766fc55d4f58cb7b237c688072c1dedf7f92ae6fb02fac638ff7525e6fb7aad3cbedf616e8cfd27e94bff32927e8c8f1e2ac678fefd59ccf8f4648cfd979198eb213b633cff64e990675e36c67a96da83f1d04ee5d39fdca97e180fd547c6e8ffd29ffb57fd8d31ce2faa3d190f45944ff1d0bc23e6fb270662c6bb2763ec7f67c53c9ff6628c78f7594c7b5113f3bc6a9bccf97bf726e6f3b313639c6fb474beef626a8cf3cc2b31f4cf1d8d5dfa93a5f3bc26fbafe28dc6a398f1d1ca18e7c90a629ef7d91ba3fc8c18f997d9ff144f043563f8174f62f6ff8231d6dfb662c6173d63ecdf8ec57c9fc09731e247f617c51bef6731d7efaf8d317f8fc57c7ef3cd18fee15cccfdc84f63f85fcf62ae5f35c87cbe23ea89591f5563577e47f2d0bf9b9d8c51fe8798ef635889196f537f7bbfead118fe5f47ccf7b5a83ee8df95df8c71de6222e67a56cb18f1e7528cfac8978d717ea42d46ffa8df8ab9fe3d2333dea8168df1fb2496cef743c462fa677d6327efbe22e6f3472b63d4ef9518f215d91f157fb47662c8f3762de6fb12f662ee67d9fd7c1fc4a398bfbffa648cfabc88f9fca295c7e7171662c85763fd47dc6f6ccc8c9dbc075fccfde858ccfddd7b31cfcb558d317eea628c9f3ac78be281a7ad31ce63aa3e743eb6690cfd1a62949f2f18bbf29a5d31df17630cfb74e27c14b1fdb65363f8f39297f662f46a8cf527fa138a0fea2731cf2f178c112f1fc58cf7bbc658efb0ebb99ec8feaff860d03746fc168ab9be736d8cfdee8998eb6b9c5f141ff46ec57c1ead618cfd5be9c7fa5f79c6b0a7763f9f57667f52bc31681bbbf2de252fc7d37e670c7d1ec47cfebb620c7f5cf5c1f6289e8c61bfd95f15af5cde8cb17eb01373ffbc688cfdcb58ccf8feded8953fff10f3f7a1ec7aee97de89d95fd8de8a77eec6c6aebcc9540c79264b63ac1fd9f56c9f8531e261e9c7f62fb2be140f9d5e8d515e24e6fe6dc618ef97b474eedf7e1863bc97c48c6f69df141f9dbb6296e789a9dfdc18e9d287f1d057de18fd2f2be6fb0f607f22c5471f3159fb7b282f52bc12de1ae37d296531e39b17b2ce2b2fc4dc7fbc33c679bd8618f66bfd618cf843e9fa7dbdaa98ebbd6d63975fef51cc78e6c618cf2b4a7ec62bcdbd98ef435a8af97eb59698fb6b5563eccf305df1c66a21e6f39bbe31ce5fbf93191fbcccc5f4373362fe9e9031cf6b558cf1be3aea277f7eb53686bef762becfb065ecd273763ff2af7c33f2bf2273be7d93fcf4dfbf3662e41f1f8ce1afbe8af93c20fc9b48fe786b2ce6fb25eac6d84f9a8bb93fdc30c67af9a798f1efd918ebe50159fb09c6287ff920e6f34696cedf136c8bb97f7025e6f9e5a231ca63fdcb1f7f9c18e37cb52f667c101a633ebf17f37dc537c6e80fd257e7b9dac6385fb011f3f9a01e99f67e5d12733eac19bbf2e7aa3fb677a52be6f89889517e8dfac8df3e8d8dddfdd5a998fb6173633c8f722f663cdc31c6fa4028867ef52732fda9f845cce7533c31df37da3586bffb21a6ffb81633fecb1ba3fdafc96ccfcf8a31cefbbe89b95fdd32c6feff4accf1d733c6f9d2bd98e7e10664cedf5155ccf7e7778d5d7a55f733be6a8e8d11cfd09ec97fcd4fc4dcffef88f9bc27f3d37af54359ccf8e52ce6f3cd1b63f46f5dcff9ac3d3786bff628c6fd27b69ffcc3d348ccfda0ae31ece58398e74b589ff20f3f3362947f9c8ae9df2c8d719ef94dccf799b2fde40f6e4f62ee57c6c6f05fb662ae3f7d1923dea7fef2ff668198f1c58331c6a7f2577f2b1be37c8ef4d5fa0eedabfcc17324a67f3334467f5279ec4f97bc31cec7593ad7d75f8c5df965cb0fe5dfd1de9bffd734c6fbc20331fdbf8c319e2fec89e98f8c8d5dbaff26e6f3d7efc6f04f5fc5ac0f8e6ff97f9f7b63f8631d31e4890ac6d81f388bf97b6a1563d48f27e6fb42d9bfe40f36543efdc1f7b231ca9f88597ed618ed3312339edf1823feb0f2f87c7f6c8cf1a7fa97bfa8faa7bf18df18c31f36667f691ba3ffdf8af97eb26f863cce1f0fafb41e3ee982e50f4e5b64ad577a64f9631331e6ab59db18ebbbd764ae0f6f7762aed73f1be379f808acf5dde9ad98eb89d762dcefcf8ce19f95c9f4cf025dcff5f8bd27a6bc356377ffec854c7bbedc92b5be3916237d9c07cbbf59ad8c519f3d31fdbf0763f8e71b32edeff4438cfc8a8131ceb38dc4cccfd2b95f3020ebbc8c31f22b7862fa174763ec97ccc9d4f7732de6fb014bc688379ec4c8ef60d7d39f627bca9fb874c45cbfdc89f9bed9404cf9e6c6584f64feb61e772566fdc562fa5f77c6a88f5b31d7c733c6f0bf5ec428bf6de928ff2347a6fdae158c71de6229e6f3353b638c175fcce72336c6380f67f9f3fd4f2fc6184fec3f21edf9742ae67acead31f62b543efdbf97a618e5bd57c53c1ff9618cf7e1b2fe6dfdad2da67f766b8ce7174e62c8139e8d71feae2266bc64e9b40fec4fdaafdf2ec43c3fd413733fec620c7fe041ccf3a22363f4afa198f5f94ed6fa4f5dccf3582d31df477f31863cc63caf903376e921fb83f6e3479fc6585f698851de8bcae7fc1d3f1863fddf18e56df7c6d82fb3fce8ef6f8cb1ff427b2dff2a9e89f97c4cc618f3f38798efe3898de1cfe5c42c8ff2c45cdf19adc49c7f7d31e3ab9e31faeb9d18e59dcbc6f0c7242fdb77712d46ffa94b7ecec775c9c7f9789137c67af5a798ef33b574fa972a8fed7bf7640cffdbeee7fb61d89fe5af0ddec4f43f1f8d719ee95d4c7f6d6fecf25f5c89b9df3131c6783b8a79de93f393fcb5eab3b12beff82e667d148db1df5e1533def68c118f3c8ab99e7d34463cb615f3793df63ff967d140cce71b9bc6583ffd12f379c1b631dadfd2197f978d31bf707e92bf766a89e91f3d1b637d3512f3f7204263f8939f62faf35fc6188f5762c8f3c5f691ffd63b8831fed796cef53e633effe41963bcccc4902f6c19c35eacc5dcaf42fbda7a5ed027d3bff16a64fa675e864cff6bfb0ab6f7ffecc5f47742b2de4f7914f3fcc3454cff2c3676f73f9ec89ccfe24f32e71b1ffdcbd67ffc2732edb57f4be67ce9b5c5d46740667e01fab7ad4f1c1e8df17c455f0c7d2bb7629e57b074eabf20733e297f8979fe60600c7fa32ba6bfd63186fe7332fb4f7f628cfda7bc18e51ddfc4fcbd2b4ba7ffd412f3bcfcd418bf277126d35e545f8dddfdcb2731f22f578de1efa93ef47eca95b1cb7fc2fad67ac5e4464c7f252be6efb7dc1a637c37c4fcfdab9131ced356c55c8fb1fbb95e6be5f17c6840a63db97c89517e5c10d3bfbd37c6f9e39918f9b5258fec4b460c7d87925fefc36f1b637fec45ccf743dd19c39f55fd713ee95d8cb15e2ffdd9fecd0f32fd8b8eea97f349503186ffb516a3fce89bf17ccf52ccf561f677edc7553a629e87ae88d97f1bc6981ff762b667cf18f5abfc68fff35331d70356c6f0afdfc5f4afe7629edfe2f8d0f9bfc70f31cfef066294b7b574d457f9c518f349468cf2cb6731d79b7364d6f7d3ded85d5f577db0be8f4363979ebd16f33c17eda9d663b22d63f8df4b31e48f3b623ebf7436c6faed5accf7a7dd1b637db829e6ef276dc41ccfba9ff3f7312be6fe5e49ccf1f5628cfe9411737df5640cffb22ae6f9094f8cf2df9ec99c9f1b0763ec0fefc58c478ac6f0876331ca7fce19a33d391f6a3ebe3c88f97ccbd418fe822fe6fb91abc6580f1b88e9df5a7e7c3fc344ccf8c8cae7efffb9fe1dd97a8b772473becee4c99caf333db0e6e7bb3659ef671818e3f99d1d99f6da5b8135df7a5b32ebdf9b9035bfcec8bcbfc574cd9fabb298f3e7c218f777c9cc7ff548a63d9b3f1bc39fa88a198f0ec91c2f6f336377fd6229e6fb40585f9a7ff29e98ef036f89b9ff3536c67e8d5dcff5888631d66fea64f903ba9ff3c9fbab98e791aec8b41fb53763d8c38118f7b732c6785e4ff9b33e163932ed4bf5ce18f6652546fec59d98f5eb83755e635710737fef45ccf9f720e6f3796bb27e8fa323e6f9d86b63d81763aed7b17d656ff357623edf343446bae465fd856563c8c3fea4f8aa2c79699f9b0f62dae38931e2f9ae98fb49763f9f37657dcbbed6bfc4c86f3833c6fcb716733d624fa6fd9c5c89f93ebb82b1bb7f9c11d37e1d8c614f1ec4fc3de77b32ed616b24e679b08598bf5fccfe217bb6df1863becc8bf9fec0b631e2f558ccf7f13b7f3e8a65af565764da2b8fe9b25719a6cb3e751ec8b24f68cfd8ecd3862cfb3425cb3ecdc9baff0296fdc9dc92797fd0252b1e3992653f307e638df75395ccfa9e9ec418af1f25639c071e8aa95f9eccf1dd6f1ae37a9547ff7d7163ecee2f4664fadf998c31deffc2fb63dab327eaabf595565dccdf23ef89b91e1b1b63ff7f23a63d1a1a63bcd5c8f4b7f20b31f72f2b629ea77f37867d5d8af97c3cf5d3f88ceac6f08fdb629e97c81963bd7a24e67aa2670cfb4a7d345ecfb131f6e7b6628effb631ce9364c58cbfd8df343edb5b63ac8f1dc5d4df37c67e38fb9ff9274331e56f90b99e305b8af93c45cb18ef4f943c1ccfc767633cdff821e67a815dcff3cf1931eb676d0c7fd8d99fc45b977f5207dbf86b9235fe96608dbfa047d6f87d256bfc6dc9da3f607e1a7fe388cceb276f648e87fe08acf9eaad2346faddde18efeba17ceadfa38998ef8bc81b63be7a24b33f7f168d5d79e79d98e7bf5bc688df9a62fefedcd618fb4d2f64f6e74e598cfcbe96c6286f2ae6f9eb2763ece73c80355f7d2cc45c4ff81073fd62628cfc3764f6efe024e6fc7b6f8cf31ec6fc3dc1c818fe11f5977ffe1e88393e1e8de1ef5c8b999ff4e1f346b3d818eb69a198e7eb32c678feeb56ccf3a137c6988f7d31c64774658cf5fcb998ef5b888cf1bcc89d98f6e3688cf731b4c56c4f670f639b9f5a7932fbc3e089ccf66ca2fd62edbf74bec41c2f5d32ebfbab29e6fa458f2c7ffa8dacfcd1bf628d97f79931e28b90cc78f06e23e6f3032531cacf1ec53cdfd53246f9d44febf3f58531def7341223ff69418cfa7c7f16f3f90e95cff175f18c713ea74fe6f98acfc818cf3b96c53ccfba30c67986ac98f1beea8be3b12279381e5f60df62c5f3d58d31ce1b7c8921cf2e67ecca3b64c45c2f6f19e379da3b31e3cdad18f5f35515f37d151531e4fb9a92e9bf7f5d89f9fea59931f62b42317f3ff7cdd8a5af7c317fbf2912f3793031fd85d3c518e7194a6294bf0a8c51be319f777e3576e9ddae98e537c47cff49510cfd9fd83f654f2e2b639ccf96bc3a7f513276e9d3b518f24eed7ecaabfaa0bd296f8d5dfa742186bc93d818f6c698fe50cd18e94d31ed71ddd8d5b7affaa1bd0933c658cf7d16f33ce4d8d88d9777a7dfe45afe682f24d35e545760d98bc5c418fef21d99fda3d21673bdad27a6bd1889b97e5d36c6f34c0f64b67756f971fcfb0531fb77c918fe774ce6782fe7c5eccf4fc638cf5611733fea24e67c762fe6ef51dd19e33c4b00d6787ed889f9fc406c8cfa298af97edcaa98fa0dc47c5ea46eecca3b8ec97a1e222be67cd735863d1b89a95f474cfd4e62ee1f5c93f5bcf054ccf3504563ac4f86623edfd13276e9cf2f623e8f7127e6fb936ec48c974ec6f0a79ec47cdefecdd8c9db503ac7efa1648ce7ab0f62ca7f6d8cfdcabc98bf97f06e0c7f5aedc7f1bb0a8df13ce7ad98eb7d53638c5fb507c76f3434467b1b73fc3e1ae37968f5278e5fbf6f0c7f12fd77a2f9fef102d6facdf42ca6bf3823eb7c4487ccfa6d6e8c5dfaa146e6f8a88fc5b83ebb3046f9bc5ffdbf933376f5392e8891dfdb9398e7d1afc4b40f5963acc7b13cf5f7eca731f6178a62fa4f8198f6a727e6f3b19e31cebff5c9ecbfd5584cfd4331df072479587fed9331fa679dace73d42633ccf7623e67af39d31e68f9998e7192bc638dffc2ae67e53c1d8a5c7be98fd2f67ece48f1ec55c1f9d1aa37fdaf5fc3dcf8d31fcad43c64b3efe7fea3b1364bc4c988932b1fb4c32d3e43b48fe3ecbcc93f4c50fd7cfedfac0ee5ff2efcbcc2a33cfac93efeffbc09bcc36f9a4d7ed7e2877915e97794fbef749793377ff47e690fc3bcc7c668e995372cf39f9f78f72b8efcc57e6922927df95448e7d921e6676eebab2932b95fdce7d5793cf7da696a6bbfbd6943ffdfb83bb4e72ec7efaf692bcd3fc1e93fa307d7ffa4ef378729fbafb8e584eaa2fe40c71dd9fd63fca4df5803c8d44bf59f29d96739f69fe54dfdfe507bfd1e3f7f34fe56ba1be5dfe3fddf7a3fe890c903bcc3cbb4fcbe9e565daeeba4ef2b1f6d07d6939bfa89f9ffbc93fdf3f67497da4ed1167baae3dc2dfb6573a46322f995ea69f7cfe73df03f7794dfefd9619269f41f241fa88e93f5fdf77f7f43263fe3dfdcedaf5df9ff4efb94cdefdbdf09bfb919e25233d9f293a19ae32d7c96794f08f798df8b9617ea5cc6de6d5cba4699e97c9279f9e93eb353348fe0d7d24e78bc93fb0cfcb4f69df9f41224772bfe77b01af533e3fea9fd49317e2fb3732feaa1efeac1d7efc649deeae1c2ff0a25fd4bff442f97f9cffc0da7364727ddf37fe45f93f7f523d63777dfe77aef9aecf5f7fff6bfd73a4f6b4f6f84df9e918f12699d17ffc3375df85e473493e59fe3dfbc3bfffcae7d7d7ce32256f6eff2e249f71f219b90ffe36b6eb16c927e1c43e8cddb59049f26593efacb74cfebd4affedadbd0dcb9cb38c6df2b7f483b293bf79bb9fe4824edbbfa497ff3b3afef6b3fde1f3abf47fb42db64e1fd58ff7bbe5fef5bc7fef3efd7bfc27d7173233eb1fffb83effbecfafda63e4e6118dffffd427fbc3bf0bdefbbf31ef016d40decd2505fe6dec3eb061237e8f5dd97bf7197b7bef23b9eff0635edea793338bef64147cba79067fcf7b6bf749afbd72e93befe89dbc4fefec1d7fa39ff4d5e7d7f571e5f27949e678cd71bf773f3ef95ffced8fcbf8a34fe1877fa732fc71d97fa57df3bfb9f6e77bd51ebfa767faefe57fb0fffdb9fc7fd81e9c477ecf86fc7b3eb281a98dde7a5f7f600fff395b76e1f7dcd9a1647ef00e9c4bc666c3666efec07c90daad06d3679c473487387993113077328fdcf7c46c5cc1e690b99b67ca6efed9fc9d8dffb697bfd2756bf6fc83fffe57f4ffe7dae3db662ffee53cbfe7b8d16ff8fb6fe33ff914bc4af271f5efeaf73fdb1fffc1f6f81f9b47642f0adedd3f6dff7ee7e355131b5f457ce162869fe690242df579dd77d2024767f752bbf5ca98e2eff34ce311e7977af7a96f9dcc3ba1f357178c45d21828b1375ecdcd2d3fdb5dc55f3fdbd8efcf15e7ac3bb3e97f5c1fcaeffbfb9fa9ff9fe726378f780f3fc8fb8fe5fbabf6fdb93cc55063fb0cfeeef3db79e4efebebcfcafe77cc23d9440eb5c74fe5ff8fcc23b22fce267b77bfb4b7bfb663bfb26b8a21befff6e83d7975af91c41023171f4c3927e033f29aa9bd4f3ef83ea7763fb372f2689e28fcf049e7a1563237a5dfcf5edbeb785def25f9f4bc7e323f25adea0d92bfcf92bf2f92eb5fcd16fe6c3bffd8c787bd5afe8efebfbaff9fb7f53fcf65bf9573fe2fe58d0fea606671c7b7ccb3bfcbef57f308da436df6f7f1d7bf6f0efdbd79e4efdbc3ca77f388c6ce7fea3bb54f3fce233f8fd51fe386d10ff789658b0b991fe708b776e2a56b22c3cc9537f2c65ed6cb7979afe015bd2befdabb493e575e29f9dcfa4930e6fb7e90b9f2c3e4da61727fc47b938f1ff9b17d265edf9ffa337fee2ffca5bff2d7fec6dffa3bffdddffb1ffec1fff48ffec93ffb5ffe25f97fd9aff8777e35b967429f3b9533cdf39e6b3be31ff4f9f1e3fee6d77ea9ffcff5f0af7effc13c92ccad7393fb9fcd5ff3c38f6b913faebdfd52f71fdab290c9fb0fae8df5f9e3fef1efaea79fdbe3d7f3c87f7ecd20f5fbb136b474e333fdb7fbf676fe631a53d00f756b476e0c17143b308f92ff94c614a9fdf6eb7ec32bfa4dbfe53ffb6dbfe377fd17bfe7f7fd81ffeabff9437f947cc6c9bfb37ececffb05f7db95d7fe8d5ff26f834ce0057e10f8eb2074ef2c9a04d36016cc8345b00c56c13ad804db6017bc07fbe02338049fc1313805677f187c0597a01c5482bba01adc07b5e021f93c064f413d6804cda0153c076d674b4bde25e804dde025e826b2b69d0ebfb65ff3c486cf7e595f05d549d063fc93c6482e3e4ad9fd4d6b79a5bf50ffbf2d776aeb7259d71edf735bc1c9af3ce77fa15d110f16d28f6b1fb41bf249dbf162f15b89b15cfa777c2ed6b6a3241ef9a379a1606b718a2dd3fb276e4db1f09764fc2bf5f3dd1ebf99bfdd3cf29f9c43e06fc3bfcfa6fe7b32564b892d5fa7b141fa1df4bd9d5b931a0403ac1d25df57ba2ff1fd6f93cf551a0704afc15b300c46c138c806b9201f14826270155c07374129b80d33a117fa611086e9d392e1249c86b3701e2ec265b80ad7e126dc86bbf03ddc871f091fc2cff0189ec273f8e5e7c24b580e2be15d580defc35a92cf43f8183e85f5b01136c35692cf73925f3bf9ee84ddf025ec85fd7010be866fe130e151380eb3612ecc8785b0e8de93711396c2db281379911f055112cbfc6e4c304a6cb87ce21f6c63a27ffaefdb28ca60ffa1e4d5828e57cbf4bd4b14676e13db9cd449c2b9243d49fb4bb6f4b7e57ecfcb2f9421fd7729adf7a43dd6d66ebffdfebdfc0b5ec6e6f8beb78826c9c80892bf8d5c1bd31748d709bd653008fa98c392be7072f73b1f239afe8eac5927d7b71caaa79c9761de837fdb5c9bb6c72fe6bdff9179447e266cce87b32fcbc4a65c308f60cf41d77b27ffd131e69a49344b7acb3c5a44cb6815ada34db48d76d17bb48f3ea243f4191da353748ebea24b548e2ad15d548deea35af4103d464f513d28478da819b5a2e7a81d75a26ef412f5a27e923e885ea3b768188dc26e344e381be5a27cf25d48b8988eaef4a9ab701add249f52749b7cc77126f9788943364ed29311135d47b53888d39723e6e2f42181493c8d67f13c5ec4cb7815afe34de621895f165c4ffb95ed4a6df8dcec96a52573885b6f8bb7c93c7449f3f09ee35dfc1eefe38ff890cc9f8de0d56b079d64b424736b327afe9a9dfcfef7946d82f6d825f67f445b9dd8e46090fcade4ea7ef6f7b2fd7a1e090671ba527eebe693527c4cbcdeae774858715ac15ba5ed1ccd5cbbcf5dbb97113b629ec934fec4c66f3997a4ff9e51bef93f30d7fd953a9a67163fe4677abb79e4cffcbd7ff53bcb3d04d8aab9db87c57a503e3e25769036223ea7fb0e3687a436289fee757b5efc155fe2725c89efe26a7c1fd7fc5cfce00fe2c7f829aec78db819b7e2e7b81d77a261dc8d5fe25edc8f07f16bfc160fe3513c8eb3712ecec785b818a7cfdbddc6377129be0dbbe9b1988937f127c1249c4493f4ec681cdf4cd24f263dc8339946b79359184fe6934c3a42260bf79d8e9c78b24ce796a8e6e6acf429ff5572ed3a7a9c6c26dbc96ef23ed92776d24b7a77f8439cf2f76b35b2e1df763de1a033f9981c269f93e3e4148c26e7c95792e365529eece2f2a432b99b5427f793dae4c1cd2163daf03facffdf7e687fb106f896d96546dc772f310df342fe4ff31d5b3ba56d7c993c4e9e26f54963d28c8f93d6e479d20eba6e9e48e7c1816be7db4927f5b0927b4ea90f31e926a36499ca3149d7d57e6f1ef9decf1938b9d792937de45fee9f3fb4c78f6719fe47e711ef843d87f43b099f67b037de2bedc0dcec177ce2793a97d0b6a5eb1edb34cd3b4c7ac1383a4efa93c1e475f236194e4693f1243bc94df293c2a438b98a7293ebc9cda434b99d66a6ded49f065e769a74e9693c9d4ca7c9c8994e67e134f6d25e3d9d273dfc6a329f2e925112c7c95c315d26a3221d29f3309eaea2da6491cc13c98870bc0ee3744e49fe7695fc6d9eb0fb7b3a72a29b64d495a2abe926ca4db7d35d78ed3fa536339139b191ceb6febeddfad9ff655afc357d9feea71fd3c3f4737a9c9ea6e7e9d7f4322d27f3cacc7d5aaeae66c18073c03f328f680d47723df35b6b852517f3cc79ddf6cff34fe690acb771f794a695ccd3f46e5a9dde279f9a9b030fd3871ff6aa7406c2e2a9a44ffcfd3cf2dbf5d09f63933963d3ad8b47fe4a3cf657e791dd0f73fe6fe791ffe41ce26c28f6aadd9cf0367d9c3e6506d3bab79f3692ef266d91376d4d9b49cbbfd28695b037317d4efcf9743cdf24ff6e4f3bd36e104d5fa6bd697f3a98be4edfa6c3e9683a9e66a7b9693eae4d0bd3e274e05d4fafbc4e72fdf5f4665a9adece32332feecdfc59100d6761d84c3f61308b268bc4fe7bb378969e6e4de696f4cce8641ed566d3e493c432d1cd2c1949c99c12612e494745728f1b1d5132d7c4c9e8982d66cb49fafcf94deccf56b3f56c33dbce52dbb89ebd9bbffd67f1c84ffe711a83cdf6b38fd96196f892b3e3ec343bcfbe669759d95bcc2a2e0a4e3f99f4ccc0d467bcf387f5ff4bdb9cd671ba0e354c6207b7ffe3ce2aa5f5df4fedbec58cf93f5b5b4abca663dac6a94c491eb7d3a744cebb5975763fabcd1e668fb3a7597dd69835670f7e3c6b79fdd973125b7666ed59e22da631699affacfb87f348fe7b5ef3dc5e7832475fdc19ab1ce29e7fad7ffed01eff7fc523a94d4dd762121b327b99f566fdd960f63a7b9b0d935677e7aa129f7a361bcdc66e7e81ad99730d6b36cba67673969be5678559717635bb9e55a7ddd9cdac34bb4d0df1dc9f07f3a443cfe379322dccd33d8d85d749629ac4d79dcfe78bf972be0a3fe6ebf9269eceb7493cb399efe6eff3fdfc239d2726f1fce0e6826454242364e146479c7ebb11948e8a79324f6492f9a3947a59d1d5fc331d59613c5ba4232b9d63d29115c6f3e3fc143ccccff3aff925f1bba7f3d4df5e9b4ffef77b1ddff1c86f6d57e2b524f7a7f67136afccefe6d5f9fdbc96f43c3f896dc6f0f99d0f5ff85edff94bf3c8cffb33d9d4eb49e680e7f8387ff016691bcc1fa795f9d3bc3e6fa4f313d611ff8a9f90c1d984a4bde6cd648e4b4688d79db7e6cff3f6bc33ef2635fe32efcdfbf3c1fc75fe1616e7c3f9c86b7b87d4134bfc05c85ff95d59b36ece9c3b3fa3e0f46db39f2ce88ffc3be690bf8f0f7fbbaef5ab75e651e6b7fee09faf5dfdfdd8fcad6d1cccc7f3ec3c37cf87d7f3c2bc98f4ddabf9f5fc665e8a2ff3db697d91044c0b3ff3b408dc9ac84d66b70817d1225e4c16536f9f74f6a4c72ce68bc562e95f16abc5da2b4c0f8bcd621b3716bbc5fb62bff898be2c0ed1447bdfc9f72ef15d03efd5cb2f3e17898fb6384d868bf3e26b7159941795c5dda29ac42f01e20cce11737ed29191f4fc244e99c3fb4a6390d902f14afa77179378c9dc937a67494526a327b7b85fd4160f93f36c8fb596f89cb460ee776d79dee691fe2feabf94d8e44ea6376d24231e6b7b6e7fdfc510b82e89db9c8f3ff8d3f6f8f9ef05b6c95bfcb5785c3c2dea8bc6fc71d15cb416cff165d15e4c179dcc9bb3d35799dfdbaf706b5899c1a2eb2d162fb3eaa2b7e82f06fe79f1ba780b568be162b4182fb28bdc221fe5e26051089fc3eea2184f1757d16671bdb8599416b7d3e7593bb1689954ffdfc4233fcf2723ac7b7af7cba4132ffd65b00c67d965b4785cc6cbc91fccd3fff83edefc57fdd7cd23b2651a4317fa7d4bef4c7f74ccfd0dc407df7baa5ae32ed9f9a60befdf72af239d3fa6e9795bafb79c2e678be57cea7533afcbf972b15c2e57cbf572b3dc2e77cbf7e57ef9b1e82c0fcb4f9495fab7cbe3f2b43c2fbfbc56e2e377d2329797456f595e569677cbeaf27e595b3e2c1f974fcb7ab4593696a90d4bcbdd701d0d7a71bddff9f107b76fbe58b696cfcbf6b2b3ec2e5f96bdf48749276e54a471c7f71c92f6fe345e413c82390523268943bacb7e38459cb2282411fc743958be2edf96c379c5d9269c3bfea335a1c2efec8f7caf01ce28ff9cf3c685f5bce2bec09c76750a5bcb3d9513edfff7d9b5894b736b8436075d66f9e568395e6697b9657e59c8ec3335c438c93d17ed5da5652d8b49ac71862fc0f96792ce67de615e5e5e2daf9737cbd2f276955979e1e3caf75f43cf1f466f613d5d335c05512dba5985ab6815a62be7abd8cfad267edf7f5f4dfd797c5ccdbcb62b2febce615f7866dbcda18c89dc9a682243fabd5acd578bd572b59a7657ebd566b55ded56efec73dbc4e3dbb0ed57bc9eb27a13ebb7a8d739d32ef06dd8c7d37e3247d93fc44d33ce237d8c45e77b8e3257934ee68aeb10e9f9d60b6de2deed6deb7c925b0371bea03b139bfa8be9b5eedfb97435907f1f611d63b55f7dac0eabcfd571750a26abf3ea6b75595eafca61695549fe7db7aa6606a9bfbdba4f7ce380f7d4bcfdea61f5b87af2faabfaaab16aae5aabe7f974b25bb527afabceaabb7a59f516e7557f3558bdaede56c3c973e23164bc6a807356a93fdd71f10c6c6131b18b897d4ed7825623af3b7b588d57d9552ecaa66b59495c314fe30ace23364ae252ea51618424692e2e8157164e9211924d3cb6eb640ea9ce77abfcaab02afacfee1915d8a3fc1fee4d8f7ed89bf85ebb497dee4ff3bfd333cae92a7929b5a389cfefce1aafaebcb34bbf726b5b2e1648eb1f7b4e2ece18bb361ab875af740f1c6b5569fc779b795da5cf631f5737abd262bbba9db6dd733235b7fe98b46b347171c9659d49f34ccb4af2bf4fda7618a4fb1f97b5e7f5d7fe3a5887eb681d47c3b09dd6593a1ac2b95bff737595d81d7eaf93786f3d4d57ced7b3f57cbd582fd7abf57abd596f93d8e421f9dc79fbf5ce5bacdffd5912af74d7fbf5873f4d466198f62fe8eb62da974c7e7d48aefb5c1fd7a759757d4eaefd4aacef7d123ba57b6c2eeef58ee9596cefe4f661ae92fbf73fcca5e893d9242df95b6a3126e989a212e7b091f7eeeadd9d23f363cd273f9cd7d23c52a00f3d4aa43cb9358b743d7de5d6b277ee4c54ba4e9572d3edd9628d7b9eae6f24df2bc5206859d8a3f5617d5997fde1bab2be5b57c3ccfa3edaac6be16efdb07e5c3fadeb8b977563dd5cb7d6cfebf6bae3f5bd9e375b77d72fb3cdbab7eeaf07d3fefa75fdb6ccae87896fdb5a8fd6e375769d5be7d78575717db5be5edfac4bebdb4d66e36dfc4db0cc27b59ed8a7789b29cc5edc1c72e2d9dc915b9f4fe4fbffb87bb3366591a56bf8c770cea56559eaa18288080a8a967ac63c28f328bffecbc80487baebeeee7777f5eefd3d075cd6e0809019112b62c50a64b7c6da32348243686a7d73003ec12699df31c12708677077df41d9ed0e697f07944f5b5a688576e8846ee885fe75105ec22b2db4dfffcf6b0b90e7bfb4cf7bedaf88e8ae7e01fd2e67f82ec88f927a12b691681538ad2f715bbb889e8f735cd8163fd59ba2d656c281701abc260cc2308cc2384cf42de58629f9dc3023f947f4990ab573d930b74a84ebe03d218f06afdd844558fabbb00aebf01636e1349c99c7903194fbf5f29f7d6e7ba0203964c379c8858b900f97a110ae423194c275b809e55071ec701bee42d5afc37d78083fc363780acf61cf3f58b103fd1c90c322710d9c031c6ad877594ff22f2d874e019e37e4fa30078170b61d1d6a4b01f6a95d0e0fe75031672fbed7413ccc0f207e24b2b7c8674e5bbe01b947c887bef0b5089f2a0d0bd847f61a79427c56f43bce37215b82f6e11ce7a886d4947e0bdfee7bf28d823a07798fe14bdc0b798f39750b076668c9261fbe87c3f0231c85e37012d15a5f2f232ad2223d322233b2223b72cc508bfc4be4469e2d3a66e49b6174719ae81a055168ab5114c5411d2551aaf5a32ccaa3222aa3caec4775748b9a681acd2226628335e4e8a33946b9c47ec45d6c4d78bf11e748f441577c255a447cb4d46f8668d8c8f63928ba6af1c7c39760bce291c31c4642b442b6d132cf8618899114ada34d24470b6743f991d2d61d3accd1ebfa52bec1055fe3df47fd82f4ad9c9efcc198f08cf17b0e706fe49e56b1ad43ffb315ccae247c06920322f78170b2200f66d013d3a2e8681bed22155dd37d7470a7700d6899a290df65c1fec23542cff98c8ed1c9c8a373d48bfa9412bd39b2c64683e83d1a461fd1281a1bbccfa2ebe542f5d5f05ce7d9f77696e4e14ba2494cc7947984ec398a5071163db40c25d6d0eeda9b47fda61d63dde0030b3d1a86189b261f5bb11d3b8118bb9aab398e8c708faa39b117fbe8b8447220c7d73888c3388ae33889d338a3ad20d52cf03d90a3736377837c8ce2ac5f3973c011a7fbface3471acb247f1128d7d34e4c8b6718e7d50dd72a261ddd47181fd0889df499d1572491b478bcbb842675369725cc737b46b26503725b55dd2eb87f1c100b8491a8ff62c7a2df2c4b027d123dad3e83dc076e1e7a3bd1a37f1349ec58c798d546de4e4316b24f13ce6d055591882e518bc41b9a67132fb311f2f63215ec5a2cbc652bc8e37b11c2bce2ddec6bb588df71a4b29f121fe0cfae8f7637c8acf9613f7e0ca5a5adc8fdffcf77810bfc7c3f8231ec5632b6af152d4d668705c8bbebdd1e649dc7872a9123aa1122dd113c3828a628b4fee77fd81e621caa2ae4662da703b94cb24b1123b71a28fc44dbcc46f6bc8e193ff707eeb4bbec323bd174e828ded207e2ee0316701b92064b9b09dd7584746d7788f7e6f6b2670edeffea38bb9010f5eac0a3fa25d945c12040e92c0a992d03d438d5e5bbcf4c46c92288993c4721264852ea324d312334cf2a4484a834faaa40ed71736b9250db22a0a8eacecae9ef4e443fc67fc86eb4c9657d8e8800a2eba76adaf463b05ea550adc37d82dc07148a638d7e8988b649630099bcc132e59247cb24c8464e5de12319192353a970d3ae44449b68083925da29a74b24f0ec9a723535b974d8e2e0b3c6ddc4b347e60bb16d335adaf801c59c7b3b3e9f88513ed602cb66af95ab876e98814b2ab2e979c9273d24bfac95bc027032f8ecec97b324c3e8275324ac6ba994c523ace520ace22d0607f437e9d52528d4a531dc597318a5729974b0d974dcdd472d6949adafe25387bebd449ddcb8731d1fba9972c523fbda4d73448c33432fb696c2889013e214d92619aa2c865efce352bcdd2dc9a99615a68fdb44cabb47666c132bda54d3a4d672913f329abdf2c279da79c5ea3c78576b4e4944f97a990ae523195d2b52358f0cdcb748363db3295d17706fe2ff225a9926ee334dda5aac9a77bb43f7440ea5d3cdded8e6e87d8866b5f21afe5a587f4333da6a7f49cf6d0e7f4d3376f0cfd89c4d6d37f9c1b7cc623afbee4ed09a3bc9108c9dda403740ddf69211da61f41908ed2f1b5974e325a77332ad3342b3901f7b8f59b8443c5d1a467b2c38bbb0e9f657a6638fbccb485ccd2b5cc46f73d45d80fee9f1f509993b9061f9b869579991f1eb24b5a98c7ec9a0559082b1afd1c65719618c245051f1bada0aa0ac7ebeee8ae5f8bdf3c9c2d6fff6e4e5aee826320f003dcba2c453fdbe610ed2003b80fb0832e3b33ccb22ccfd0e75f76da31d96465566987ac36796010c1f3215b021979c3d78ed92d6bb26936cb988c8d2ca38c3eb279c6810f74e40ce11e5f813c1cf818a8d3e88a8bfc4ec6a3359ce0ff2b997631706f7ee7cf5984c55657acb3d2e60020eeccb36526642b03adb8abe59ac05fb290f7cb44740692e584ef06aff50c3ebb7971b2ced6e8ac36991c6c3225db66bb4ccdf6a6941db24f2dcb8ed9293b67bdac7f99666fd9c073b2f76c982cb28f6ce4c4f6211b67936ca5bd69fd9c46df766d69396d3939a5b3b966f28696eb0857e460f34d37377233b7723b777237f7723fbfe4d73c407e6e95877994c77992a77996e7ded116033d2ff232afd07bd1869289e631aff35b2ae58de96a4be43b429217caa7d8eff55afc34ce67519433396b1ebdbccb67913bfb6a13b1ad04dbe7c53d934fd27c9e73e83b2c723e5f5e132a46982cfecb39f90e8f7cf5251d3fa9aba92bb990af723197f275bec965433024f4bd1493cfb739f2adb91a3bf99eda0687fc80ec66c7353e61bfcea3efbcb9f762227b093102f23f0a3ad4fcd365f3637e021c904ef273decb9679ffba4806288afa3094fc2d1fe4ef9a9a0fcd3047bf27d37c948f4d2e9f14b461a2950eabf98de4021ff8ed97c373dd977a537b5dd17ddfa0d75de1b1a09c2bf01fc8f3e0fae29ce1d950e0efb063aebaa118be21161af14bc08dc0381157700da5d00d01ed9e6361a0f773cd7e8122b6c2cafcc22e9ceb67226851e11aef8517d78154f8f9b9b8049be89c9d733bcde07fc5b5089c2da584459b5b23fe3cbc602d23ccbf8d29eeda146111157191a04f4c01c142f5acb50f66cbbc40676d6c5cb3c8ee8f624e7971911745382ecaa2d2d4a2463b68a31df41bdaef0b74d6b77c5334289a5a187c312d660513d6e8ccd9625e70c5a2e08b6521186ab12ac4424af2625d6c0ab9508aadc75369b12b54eb54ec938fe2507c16e8bd8a53712e7a45df99176ffea51814ef86560c8b0fcd45f6d0376d972d46c1ba18eb8d6b40aec5e48a49499794553a1b7a1fbe61fe29177154536a38678739a8a55e1aa5595a971dd4d1c196e13bd9d64a1eb92d147f2b975d6903962a518458baa557fae525285a6d905ecb1f3a3ff986effa33bee291474f1cd87b9c8fd24c8405e6e5b50c8ab80ccb0845a50ae490cc11b2dd23db2a634b2b13932fd3320ba625c20f65611fcbd266114e819acb7b595d742a45b13c8acb35377d77b9b2a685f25636978db3f39b400e96e5b498eb5584ac8af666d4e5ac644ab69c979c390cd964e74fcb45c997cb52285766cfa6033b1fe18aab635b91807d05f6b3249fd5d699bee09147cde9c927b78fb07b601d95225e5f0ef95f29e15c998ddeefd9a73fb2f28635727c17c2bc51b9ee2c19610601a32831e1fa203fc3c1ae8944ed006bd41f6a2a649ecb4d29978a1940b48670155f6ed1df76c5a9548b416e96fbe77e2084d38a7b7d24a2c7e5c116cbcff2886251c31f00a38f30f9c8be2f4f5d850d9fe9d3a3e1946782be906d3d92bd8c7eef11ce2cda695ceb19fbc6ca72f429c4b5e8cea2e796fdf2ad1c94efe5b0fcc8eb72548ecb49cc557445555aa55786f15e999555d9a55239e9d1102bd7505ca3f220a22ae5cb32b735845f4cbef2f50bb5c5755752171950fbea62d499843e57b6b4ea5a05c1a40aab88f20127215c95b6361bd761aab84aaab4caaa1c7234c4d695275c73c70c46f01d70c50bf46331ad8a7097c455595555ad2ba1013517c89fb4d8e17cd76679c4b97f8647c83937f79f4f087fe49452ddec895169fd2b8adb81655935109d985c3545361406d08fcd7e30d38ed5cce023744d2ac672a2ac62abb915b7b872e49815572d2abe5aa68e3ed2fa9590ecaa95197891c95f114aae90af4536d8a92403e13ae89331b46a0d9d00e87f9ba0a8e40ae1856a5bed2a3531008380cfb0ef58e38593e07fe747daff3f67d45f0e608656fbd75cd893efa6ec2f7f6fff463dfe47f063e7ffd1753a90ac0bf828b0e2856688d104dddb37d891f877589f22f24d22f24d42f5a9a168ce3c5647f49d4fd5d9faac7a559fda134c8df1481fed97358a49e7d55b35a8deaba1b18738cfbea0386f534af7b8d2bfe72c1e7502882b315716f76ce0bd6b60fe2cd85e38ebc474e0bd901faa3eaa51b5f2d46a8cce64624e6a145d0596191653adaf9db5634dd55a88ee388a851573a11dfc21dafb28fa8148afd603a6463b17af60dbd26ab3b66abb766ab7f66abfbe54372a455145494da922ddd0c374101deb6b1da03b3a41cf0deba88eeba44eebacceeb22c8ea1276545737a9abbaae6f7553879504dfcbf5ca936b828d238c78b4628ec87323f45a4feb59cda414c4af388722b7793cd05b3950be2bb96c68f897e4e4c8614ea5eeccddfc52ebfe8247082f0a672e39b2531c29762f4e64d46c8c22087437f1f54ca6e87bcfb115ea5753e2eb0c13d960aee6ea45cdd74bed88ce91bfd26618d7b51068995a8cc38f7a553215c29585657850a7305c43ace78662235c558bb504f78bf84a7382ef1fb2e16950af8b65ead79ba244f703ed18f477c910a133a0f3adf755fbedce78d4471e8ff6e3117c03d53ea2f554cbddff3b5ff4f4fc97cf00ae36c6855daed1ba9f0fda21b5d2c600542901e70e59f696a30dcfc7d97da3dd5d1db702769307b9b69aaeb7496a086961f0f5ce146bb5ded7077b0d7ba4fea44f9e501febd355adcf75afeed76f955a0fc0f3619ed2d3956863c97b7cde1d6d4ea38b4b5ff84ee8d3dfeb61fd518fea713db9d137eaa6dd90b93227650cfbd83c427d02e2cd9b09758afb5e17a209f2416362c3cdf1cdbaa1bb7a736eeecdbbf99673bbe8f1ed7a0b6ee12d825cc52da656b784aaf59d26dfd208ed44dbbf65e8fd8eb7fc56dcca5b75ab29e576bb359444cfef36fe4c7956739b46e16d766350f03beea22c6c01ac1bb29d4572636ff31b97f76f0b6a47ec0bda916ecb796de8b333bbf1ba7e5bde38637013c251368cceb755c6dfc45fb4a57ec52351cb61257d8612f24b5b47be49b7f56d6338f91823d8611aa16f2cdf94627cdb22cbc111ee714c3b576437258bb9ed6eea6daf5f82258ab3d9dbc1b16f9fa91f4a805bb08fefc34ab0b14f041b8a563bcec2de8edd7d6b6d6f00f1fded743bdf7ab7bee1840c7afe99d86a0bb8cf17e3e97e7f8b3fbe1c687de8b6959864ad743943bcaedaf7b1e86aff58378f35d5f9a9dbdbf37a7aca39b6ffc3fd3de3bbbf014e377efe6d606b6d5e0de39bdb80dc531249776bd99cdcded13144d7f7e336ba8d11f6aa0cfe36d1fa0ddd5045047ba4d128aed11ba331cdb0b1bcb8b1b543e398c706d87d543eba63117485485cfef011f0ed1fb6e2be9b9e724106f63135ad1d1baff1ad65730938ed68ac6d2db013b3f50b63c8f8b5b6057d2bccc94536c0a651c433b44dcc871ada7a7345f65433f74da0cf9bb089b4ac899ba4491d097ada9bacc99ba22993aca97ce41410fe114d14af6662736b9a66dacc9aaa61dc4daad1139a83bc3870a1c0fed37baad7b0cdbce1021467bb3e7c2e3a07b4bb9b45c337cb46685629157d52aa3ba352e09cd2db966f8a79538dd848cdbad93472a368c051e29b2dba8e3bdf6ad4a7fe91dfe19131c541ef0cae7b9c352b7d6ff6cd21d965a2356e3e6f3877646c2ca7395a7bffd49c9a73be35f786d5f40cafe9bb5ead9893e6ad19586fcd7bd26b86b1d07c9429bac612c986d81782a76085032313560ce91a83d5d58c1ef880d86eafc07d310ad48b9ab1e31b6d5f4d75c809379a7af221def3fdff03dfa1dbafbf7f89aa9a0959edc83a3e3defb10b1ebeebe9f5ed2ec1533e47f7f7f3c07fc0417025ac2782186e03bc6e35ec43ee119c399cd2f918bd5e9c52536d8aa0c0d44ccb298a6fa6f6d469565397e4b530e36430f5a88fa93fbdb8b7e9751a4c4343c491c608f2d5049be0bd6a7636a5b50dfad7f8b28bc6da476a1a355773126bda51eb19f414f90e642bb45a41bb0f7947d81dc4777431a66bdede5c739a002620680f6c80e14ed36936cd114a3dea3cd461a7c5b49c56d37a7af377d326bc421c4f5b613a9d4e6753c65c4fd9e9dcd2a61c3a165a7fca4f97b7657020dc597ad5fa10cc9d453ec19b0acd65ba4277c3361c175028b235b7e1549c4ad335f21b9be986f4b7a0e7423d01708c830f529b76ad662a4f157465b79633dda147d51d4ef77f098f34ed017d877b6aabc9d3c3f433ab918d37507c8daeaf73d50ed3e3f4942ca7e7696fda9fbee108b08bcd35845394e960fa5e54d361bd997e4c47b8a7d202dce015088fa16bdc71966f03623b496ddcb0b214dbea21be17a47f46711d6215c1d7e3ceb331390f627f3b1c405effe77ee4b19a5f7089ffbcca91df7a43ab746c88b0237eadd57fc121deafbee8c9422b24826ad722743638f811eeebe3f9a46f68389dcce81935d30a29ac2ec3e070755df622cdf4489e1933136a2ca43ea2abc88eed6716a5ceec9993f50c76866256a8a142af1ece6f41bf046d5bddaec1fd1670d5f4e7bd4df0c9e391e0965a9979f03c13a1f46832f3d1df34c889805d03846f229b6d9e482480bc23c23dc48f10e48c6c028a98e08ece2eb3ebed6316a4e7f25363117e6a6661f4119d2e9c319c45b3789650b4afb8ec75e9b2b3547383cf5936cbcd7eaecd8af09c0c67e5ac0a6e60af757556538d55b57568a869bc3bd2ec366b72ca1031fbdd2b25c3450838f7171e0f3e47dfddfb29483d1bf757d063dc87f186b0c8a13ecca6cd6a364bcb193363834370c3bd0e6f7f561f217c5eca875a72f4eed7ba309bd734d8fc720d36efb2d3fac578c6cd1633be282dc0467d633d5b969cc921b030018c119be631ffd0fa33c1c4780e61490e1fc037a3c1ff9338dea2dc0b8e4028926935ecd90a2c12c404b582112fbafe314df24436c4f20e603adcabd9ad58b0cdd4579cf03b5ff2145774f9adaf111abadf9d1f79f88ce775d4ae2fca7ee098675cf3127de1d76a2d3e76804f07b948723de0bb90cf34bbffa3758522d77026cea450bf1898a77da2f71a7a0b743f10dea468ec47da3e3f970d96b3f50c6181343470a7aaf9d41f81eb0210d75dc999747bb78b4bbf72639faf1078d06aea0fd05979d38cc4b4717f2627f94c996d67bb993adbcf0eb0136c0dbd4f974924d9e731ec4a7388f00a3ffb9c1db5c0655b8ee806dbdd9c3a7479246a373be9d7d9b9d2673d4705d65b7c9df5eb53359fbd25d7f200f502c2e7a16fc0416b7101f8850bf43fcc06e8fbbf1b0a7c5e9169c7d970f641e55057c1b8c3beeb94603e41db774ef8600dd101d615f43795dae90aba9ee7b6aeffe77cadd36c145ef355c4cfc6d5cc3c829a04ae1ba088a172c39bb59c4df24f86662883af5c40d6c8c70f19ad10199d31d01d47889c31198bb1cd23836e10e3929c8eeb90b81bdb54ca1fc0eaeee2f616f729d38c6080c4045f4156ec3469f396d80e8385449ff161288c17b7999be798e1ebe33778e40f7d0cc96be1f3a2be721cbef99c679ff49cf77aca9b59237f50a3fb981559c9f8a091c35c982b13405ddffcc096de31df907546d1381332515a32f1f5c824f412f387a15fd66b79ce5dff480fed1764c7a625933299e538a1396172ec3b0cb035b053a02e92184c911eaa6d3033846006f915438403f90011f62bc96b11fc71e7caa22bce94e017f03eb6628da98025cdd4cc2d1c320d336566d6bb76601874c63d1241c0de7ee45a001f58385e64d8a9e932983f46b79c4e2e82feb53eb2e915ae49abc944538b29e4fad16344f5c33ebd0f0ae00f3073376ef59f0003ac09b70cfc67cb92e6184eb3980503751c11459a3cb364042bc15110e9c786d78ddade6fdc774efa62303ec1ba1f1d478d4a9915d63779239cd52f35f7d3173c825ee32d19919198758aaebdb106ff1a3060df194f3b963eb36164cd4d878c125880134caeb8d56766cbec18645d1884c89903f3c91c99538d6c3e73cec78035989e6b927a4a7b2f4c6b8c7c08c9e9f8e49e9a3da6ff72cf70fc0f11cfbda671b7bb17d5e4a2c9c3c7bff88aaf59db97c727bedb4b16981c45e69ab58c7ed63b7c7b7f4efb394fe7e24336b75d1ffef33a839d862b0c3837178acc5ba95c46cc206399f7f08319321f5981b3171cf85ca88b30a362cc8c994910514ad8a77c96662956837bd6aea7966f87fd888bf3f1327a96ce1aac6939ac059d3196761b9a1cf0692c03edc92b6beb39ebb02eeb5ddf589f91d80b7b35433600de8c76cc4443841c08bc8e0d21176558571dadfcb321428e1a3c1ed44dd808bf9fc3c66c12aed9748a6ca3763204d780fa0ace5b436d156b92b4b6ce31c7f8f3336add72ae4ef7de10afad7138585f452e5cc867c1fb251b4d65d1f95a33b4ab4ec8fe57c0d86fb5df635a68fb1436f73e01c2e5813e97b7dc740ed75da8b1c55d93defd0bc7ef9ee7b59804fa30802bed815f02dfcd96448f8b1e5c13b6626b0fed904a02de9921348e21405d593bb337b6217c57768a8248b8d34b9631de58969db31cbb60797689ee83c09aec0a678a1d52bb267581472d9bfc1d2c105969e8ffe87e8402f159f87ab7af238fe47518b7dcfffe78bfc7dffff8f1fe3c177d265a0f90c72c745c0d75708e6d04e7c1622b4bea68f7f378fa1e6407403d03e73a3f882e81897c450d99873760ab987d165d3b766df69151be62bed68eddb072f819abacc26ecd305db23b569df6d93d7b8895cb1b955b657ec0da35b8078afd6c7b563acedbbd7f843d6a1c7b62cf75c9f67c2b1ab2fd621070ec1b3b60df8b253b347aec073b62c7b6ca4eb47a4ecfa9b9765dcff5b9914a73736e9962bd2a2ae3ad8eacadd19bdb7367eedefa73cf9accfdf9657e35f479808eb05806aea1cea379ccf4e7c93c9d67f3bcd6e745b19c97e67c5ecdeb7985fe1f4eb3f96d7e99add06b6ff07a74046c346ff4c17c4a6bf3d9aca6eb39c39e238e8ee7ec7c3ee7e68b394f2de8f5c5982f99f15c08dcf96a2ecea5f97abe99cbb3fe5c713ee6dbf9eecab8bbb97aa1e67bda9e1fe69ff0bd6986f6690af9150466905dbfd0de9c991fe7a7f979de9b7fba273a86bfb360f3ffd3478dd25c05bd6f7ffe361fa0737f9f0fe71fe8f7d17cec2aec199ddb845e723447711a3be074ceb0867309810d8bb30d9d73ac23e772defce8f3a935b7ae6a62993746e37cee92e4f13b77e5022e0c58cee1222e46af49d06bd2f985cbe0bab58fe83a72395774bf37a36602f705ee07573e9effcf3c3613ae0a392ee30a2ebd9db91a7faecee5705ed6a496b82270b91b577305534d33fcf7a0bdfff87cd1776ad07b4cd3607ee3661c83d648ceb1dc9ce3a61fe1d860b805c733e3696f36e496acca09ce915b79334eac4bb414b7b7c079e7a4eb1bb7e636a9a46d38b9bc700ab77578caa2636ec7a9e83e35e8fea0fbcfed69edb10ef0233a081e6935120197805689cf1d667ab0e43ed1f53f722733bcd5dcd9931c9d23da4636f045f53dc4dc98bbaf72fdc22b22ee8ded7303ee1d450789a595b18d3008b65716b101906b3139c023e0111907f913ccf9348fdc90fbe046dc3814c2253769b37963f23aec83902f5ad0d97941d1938546faec4c17638b4bdb6701bcd6c6d116fa656a089093825c5cc89afd85b13067e542afd385b5b0178ec7229c202f1e7d975f754b7af4043d1eda9ee9eeef7fc58ffcee20b9b098e09685b7f0eb63dbb3a9b51c6a89da70dee2b2407ed9da2f82456839c89758866cf68351aecf75dc8be32e22ffd208999f8996b388b1ed3ce60af860747d12b0c3c83e7799fa31897cbbeb688eb18e187ec4518949d02c57b43f8fffa947a8e0591ae9cf21bd9e100dc17a68cfcf3107b7135e1f67a893ddffde3ecf5016a9e178793e5a64fe0070515a2cf2405e1497e1a2bc6617c75d5dd6d04bb2a816b52dba03dfa1f68b1ba55617b65e34e85a4d17b305e3e8c0c56a670a60fd1d882b3a1d4c7cafb4effaf75b5d14dcaf80fb41b0ee1295661aa5eafe822dc666881ee70bce652f3695769a7910afa1e7d1c091d26c7bbd58506ad42f8d385df0357bdb1a477f00b92f73f4c871e01aae3cbfc10eb14657c376101eb731431ab3d50c40f76e97b933eeac37c875e3daf06eb1b445ffa23994aa99f7fe67dcc382753c747a9f0b0b41fb44a87f0499656b5c72e80aadd0ba13f56a21a11db35e6cf2033a5f19624e8421fa4f3ddba4eefe86f952d04b78809e78aabcf709fe8707ce7ff5713da65928d460b15dec1c01eafbc866819ebd41d1a01352958bdd42b5cee87aefb92b3ad7833f88f9d25b7c425f8a236966e42d8e95be38195625911d04b99ab68f037a331c60a9741c07f2d8e10912f59083c4f270ed6b7a1e60bcd9fefd9f7a845c13d45702fb713edd7d86f398b61883bce6f9203b19d7cfd0ba49f7861239d74f5ba414cda4e8c599f2173d5028227d208ee66ed0f5f4b3c5f51c1e8a31d48916fdc5db02cf9d69d70cd6fcc2dc06ee9e6bec636cd93ce905bcf6b363ddbe56539dc4fbe86e526b2b5dbc175e3271e40583794efe535f42a7c50b7d721ed6791ae33dea5fddc570f1e1c535dde6289e7835b8a63a6975ac745cd3c67cae8eff65bee18e9da71c06c9b958d8a658dad55a8c6a7b315e4c783aae28bfedb7f3705f5e4d5d753938f014af41ee0db3da4c93072635302f2c8ad4cc2b9fd7a92d6f20db8d35e4a147e04907a39d9342f257f719557fe768757bb1df38f3266ff136eff0aec75136c2230ec148e8fa215c7491788ff7f94bb6e3af7c60f27cc847d51cf9eb0038c07c7ce1f9844ff92cc7be017aea319b9c706f2fe604f3a89eb84c5d6dfbae5c317e45d860ebe797ef72533fffd8ee14cbc5681bffbdab34a3efc2e738e3631a6dddc37e79f4f2abc19cd15a71bcb892f9822f2905e7327bee99e045be02ce755b63da2c6e7ccddf700e908b35741d9b4b83fdc7a9f5235d9f0de92d7af88c4e43ffe51e12de2fd6462ae9d37508be44dff3536ec7cf52e52a8586cb3a6b9e011e24e46f70ffd6892ab16d3cc32c28acbb8a7b12813b0cfde2e8a4587ece73c0c962ce8f5c05ce57219371f72db82a057977d2478e19d4c03ef0da2bd8e5d6bd7ce4daa49a652234ce2f78de68f86585bc29ee337b871c92ae82ff4b4ebc8090abd7f27a26e8aa7bfccae8f2eb9a8d223c5ee4a5aa4657f91df91292777ad5fe38b9495b0b7fb3aa7656c8dfd5931d503470b97c9f5f2fa6fc86972905f992069f7700b51a646d544a31d71e35337985df166ffc8e575997df9b36f86a4acd4d332c13fec09c1d1fd8e08c07954ee00043ce8ad48e71ddeace836a7f6feb0b8f7c63773f20ea9dad88d6cb173ed54f3e9ae4fc1022ef13f63bbec774b74b603d3413e2375e7d6077deb6c5a0282c13f94f7fea8a9aa3599444b41ee1dab66baf847e7e74ef36b4aab9fcd18b2d1d572f94a8e24fd4c774035d66ae0c3c09a2f788f5004e440f8026bac3cd771a5f6d3f3bc4f36d8f3455f1677ac9f7f8beb3c05333c91c8e4ee3dbb9fb911eee7b83d7e21ee030837a03e86f68fc82e1df920f7ee0789676f7251e64155d737e697b0468609910df023c1a525fb965f8ef2f7e04e7f827d0c786190311c9912d926b3fb2728f7fe787d43be0247ac27f5c3ef81130500c8b1ff3939b9d8f08af0998dce4ee201fa3e8d3256d83fa410fd7c99ffb063b0d11d2533e683562fe9e7e53847be70beeac8bb9b5a4969a259ae152a77cf784f35b9d1ea21b1a4b230f8343a03972f4ce1745349bf0a55546d0e7612ecd2241f1bae9f8013042701d03f8686db5cf831c511a927ad6734de2e1c7ad96d3dcf5c680d542f8f0c9d7fc0307958f20562874cb595aa5bcb48167d19e07611da1f3e7f3878ffb95b78177f369e92cdd787591bafe9856d76b8a7385611bdbe09997d476e92d412dd03684e5c50c9dadb3585ea94e5b06c73e78ad13fd85e7f923dfcc1d6bfbd9dfeef5dea3ada0b87e870f83269adda7968f8ab54f5a9bdb69f461edd8b6f7aed3ae3d3992bbd6dc65b00c9711dcb98e63097e64190357f55105ea389cb70c74ae302feb898f03887d9968476c7f80d7e3c26bc166e25e0e11a1567e992e3357a2f7cbfc7a2e18f388a22a1a7ade96c5b2243e0c344f902df2109a27eaa35c39e4df97555d507aab2109dfe969762d9e87d8fb4d8dfc3fd024d70f75b6accd309297b765d334cba93348861460a85dabd592bad2c559ce968cf5994e3265c92ee74b0e3d2e169325bf5c2e0563611e0dbbe5ae769d091ef090c8ea729f7bca7fad4f588f7a46a7ed023592e5ea1ff521e871292626ba57c2525aae196db9998e3bf6cb9d5361e1fa88f7f01dafef83beefc5d098d3525e2afea4d8a2f84160e6cb2deebf2fe96e6ec93b9957ac99b1b744eb02b8ca4b75b99f968b08eb4f9edb99302a59a70f4d7bec8f8668fd437579ff1b3ff27b1bd8f564bdf65a3feb0d3e748b5e66d952f9f2106f969f866628503bc7b6c0ec5807cfbbe4a996dade59e87bc67ca02bfa96c7e56979d6fa067ebeebdded20e85e5da182691e176b47a67694b2ec193c2058e70a8c44623fefbc1d1f7c104190e97ed95fbe69fde5206852a59d7f38686bab832fdfefef1f5e232edf59d33c2e8785b7fc588e96e3e544a00504c551c4d7d9be8fca7003411374ed28a0afd6bcf1fc5c3004e8a5343f4153463b16fa73af46e7638d2e32f59efece811203ba3e98e183b90ab4ddf19bdaca1cc93d113cf2acd4f0d307e04ec33328c14cac602a58da01b8ca8ffa78db3ff2c25079c6338447666cb483600b8ee06a7dee9dcd048fcc1da03b3db56efd9d0113071bedcd3c0abe7011ae18473f7486bfea663ef0c7abbec0abde6f978379e847bcdd7b2b54bcaf7e9d31f45d0ea7d5eeebf4c71d91a28580e18510578cac34823c95103d756775b8e1a5664bf219d8a7a0ab27c44222a45ed2e541307f0cef10b8d3086f88c6da14842c3908b950082566be78c0a600dd5e63e35ef02eb16d3a9a04cc4545ffb70d679e987da1d28ee9841ad107f07d4473891e113db1fbf13ccfef3f7c041d32ad116ae1668642e3b2c214f993caec4fb7d73761368b7dc55e098cc01a9ae5401f39d4d9eb77e01cb898c5d3d5bf8bece9badd7bfbbaebf7aa35d9b2c33daf00be5b1759bdec069225e909f3affcba9f7d34ac32369cc410386121f01a56a7031e195af70f16890778e45b6eaf77e7e8426ed3c32a4fa1b0b40782501fac08b4e0eefa01db6e9e32323e11bad62b762c882e779fb3f53c53ec9937f7e03ffc916efccb6cbaa79a41b7f75e6deaebecf353ab0578be3fbf9b5984edb22069fd18d74780a56d5bc2faabbde8721846cbfb825c8d81d974c02712362125c88282fbcc311b12987e6405003ec1b97ec97284adb0633e4ddefc803e67882402660ab9f70f58658e0fb9a0faddd2bc9c3fd4a2a026557d16f68557d6a08d017927ac73e8fd32d7f5effb11d75b0987782a7ce6c2f2201c8593b0e73401f946ff2cf4f83290b291b531559ccd9d405dc71cb926e0a62e43fa0beff5c9072766f7f7ce72801f7e589b674e6cdb797def2785eb7b3b3f47653fffe804425f781306c2bb79840eb1ca6d59b12d97d8c2751461f84ddfd1b3bf241876e40f04747f8591301626ee00787b5877fed1af6f639c3ca6d478baa28b08f7f7136edcabe6d9f3faedfcc6ebfc91d7fac85d4be31bbff0dc97ddf18cd4d6beb6fbf33e0b90e482486d01b403a754b9a256da4a5f192b13f85e08c18f566dcea5b55ddff8908e5b0c3f8796c9e7d4ca5e392dcfc826391bb8bbb03b3a5e91b159b9ec2a2bd3b8eb4737ac15c21fc6e696411fe1ca07351aede8a33b15555a9f19af2eab6b335b05f5de4da96615028f17ebfc15bff8ccbfa99d0f1af6c54e731d0172faab68aaafe2e8b44aac7d3089d855aa8f78de58dfacc0cec736fe9e8605fc57a80bb55803ecb2562bae552bb81fe2de674ffabddbdebaa7dc15f85ae0b9619cd75edfae3e627b6d7f05f623088f3c7a7dfe8903b42cf13424e0eb619fae937ef37bffd1b31ff9b56bcbbbbdd501e6039b89b9cad07dcdc3e1aa5895be807560865ffcc41be4b61c71165ee7ad36dcb3fef1579ff33c7f64fba7f347ced4b3eff855afe3f5ffaf7e85d44a3a5da24e9f1162c486ea4d6fab6a555b6b435cddc08fd88ffee35f39c2f79f89263b891a568d4d749c02b4e247e6e4e660659923e4bf01e583d63ba8dae478820e7e7f607f2be6d9f04216bd7eaa57abd98a094db631de17e565b862b9fe9475e9d59c7fbf8598478cf3249067bffb90e867fc08e6c20147d9a60277eb2d57dc6a7171fcc38ae72e97b1509ac704fa34d06a5f2da1e7f08eba119ec01d41bfe4793a1fdcf6f1dcb9bcb86fb4c51d242225c7437b12fb67c2c526fc27a5c523ffdc817020f4c1f32bdb5a09fc04d4fb5e7b123b3cf2f021d6f8e5f51eec10a2f16f4eb4b3a6ae56d6193a02eb034c67f8b23ebb99572d076ba1bdcc8effea475e75fc7f8f47beea406d5becfffcf7f39763f0f2fc7b8dfa49bb7688fbeadee9fd4acce895c45d56eb3ab4a8d5e6de73f8d21ff0128f6ac051edd40270975741ae16f6333ada0dee4a2e4a5e8b498f2207391de8a5809c16bc1fe94381bc0dda21ca6abbda314d76d0ae2b95f2811bb0da6bc2eab0fab4dcd531baae4ed467379ff1ee3f7ec55fffe9e309cf0ae168d24995069fabf3aab7ea476366a801f716451058c5814251a44de278e8c3867a51243c7cc41d47786d2fe0dd7740071c5c0712a19ab8dfb0cd11b63d83b89fa2ebd7f33b9f0d7ea49648e6f88f7a09ffce239e25a9a0fbe7d8a6e32f45d7fadaff01e784f35abfc323786d10dd0443b69cd59bc7547ddf8ba5d5e0620373e865fd92fb36d6d53003fd50fdcf34f51ff7f8791ecc573ff23ccbdc7ed9475d1eabd3d17ecc237a7ede8bb620dea3033cd3b069e72e297cb97ab7d5d570f561f65723d28ff0da07f0ec43b042d9dd66425d04ed18adc8621a45564aa1d75661afc68b77974de6ab8948bba64810fc2499624ea8256ac4e7c4e851d445a3fa10cde62c5abea52b58afb1126dd1115dd1ab58d1172fcd46ec748abd2fdfff27f04884af43806ddac5aac4400c6752e95a8e18615b6e41e4c378c42792de4b5cc7f1ba3eec76ce09f7920bbcf702e20a2caebb13ae2d46b7b813b7b5422d2e203ea4c37b98530dd98b7b9dfdcf6be5ffd923447bd0e1007d805d1dec19afc0b9433f7b1b257ea9b1138b07df0bb47a101ef1c538bdb9ac9810ac81e71274331e5bbf4df871045f5ad557bff0cdf1e7f3477a2f7be949abf6373ee4ab2f79b6b9646fc2d943ce9fcc3a44be64f12ea6534bcc801f944c0d0b8ece93bee64220dfdff6cc8d882f801abb98070cb0a2c5422cab21330ed6da15b44796bbf97a696907604ee24ea033f12984e3554a692042bf8a532696b31c8bb5b369355f3fc45b50cffa7e2436e2549c890c9ef1f1f51afc7d1fd23ee2da134b5d40b34564afb33a3543ff5d9c430ebfed42bb3333304e38137d123c61cebbf7cd3dea1da0928376086484458e6488b5b3b8107971290a368ddfefa96f031839310a76eb85281adb87ce803998e7c034252c90e77e90d696bfe083df689cfcc923d122b134e8bf2713f69ebf2b796fc0230f7e591763dcb531711d052c00ba661233056d50719dbaa085f3c5df434c73686744126ee1b09d4df53adff119673ef4317fef47fe9abdfc9dbec7ef6ceed3f3759952c58d5ea5b1a5d532ce97b7d36e7e9797ff5227c6357aec2b5074102e45593b888a7012b7f94ddcddaea2aa73e21e452d1f70f5ed6e7e21a0fa2144228c633842df0caf6f81a07b78528141e640118dfc467466640ec68ff88d5ffd08e96f81da2e701242d05489d12e99b7196dd0f2821e7f9b74984daac610bd0cadfe438b2bc8e40288c7bb595b4e753027712f5b39a6f8994ec29b78144fd74ff12cf6421bbe3fa92842dfa0395c249a7aab6786d88f57e29b057d25b897d0fc30f962210e504027a411447b64873a57e27fa0ce24be8bc390133fc4913816274435e2b73da7bf3d7ef3bc6e075eaaabd9bb1af998646a40e9c31c054c9111553af8dd70cde3f222d1fe0e6a4af444a224edceb5fa89fbf6bb7930ffa5f9ec141d68cb9d7e339c349a61958764da696574bbe40fe25a9ced84aa605b1b46bb2b64795ecb245d322453b2245b722457f20ca1c013dc10a257718d01d7f88db5214abe74a974a794ae52203af3fd9c27fd85241ec5b3aff6cf5a893ffbfd5b5f02b3a1407b7f4a959a2d855224c5a0fb84b50acd52c2fa31734301fd45299152295b4cd1ef1699cb08ff47d70145518c6728cec59c2c0e5a5f020dafa95448a52048953595ea455edc48f485eb22607f5de9268852a3a1d8bd3e4ad3a269d53cd0759266fc7bc6d8a7ac3014dbc41903af21bcb909dc1b89991da02601751ae46b9c079e79c6937f13b7a09d29b186b2c890f56cfbcd6f8352627ada11345dec56bb31d94873ef04b92a7a683512c7c834e45827dfd63dfe5f1fbfea2f3ffdffbf345757f62f8e0d9958b32f2dda0c2fe6717d930fffd606dd992b28fe86bc3ababbbcb45c1c25613934afc1991ff2ef6cca1ccaa3b49244e86103a502587592549febd5eda065d9d6df4a6b69434f9087bed1ddcc95c76c8ae8e9f71ff523981f14408f239efde883f6462423d029e39c93025c0149b21c4991b6120f9a97e154da05b5a49a41dcebea1c903535275037016e34f20147693f2d5054ebe97be9902f419b51fad45de9289d0c0173816ddc912bd49b8b03585264a4f37407bd8a04db184bf6902952af1c1a225cd716278a2d470eebe82e52d29382f1d0e53ff1217f76c0b9483ef26db8afa8d54f80684ca9dff943f34970a67692fade8d6861ea7b2d95dea441a63b3a257d67fbff83e3455fe0173ff24ffa901ece174dfc436cd734e438a4f7fb4c73acad01fee14ff4991e1a1ca42ea027a6799686d2473df3118a974669a94566288d132db1a4c99a3644ac7e83eef89a5a6bc13239146f6b9debad0d3c1ba94f95a6d3ce951d3fe69b7773cb7ffc3a201be5ca6bb3baadadb5bd76f2bedfacddb5171b6be0ef3af1225c4b7c99ad2febeb3a98b2e6d67284557392ea75c82f452914894a1fd1b1250cbf155a4145bee4d6916621bb3a81d927c84ff93073c3f7d3721df3bce1826e19608e75b24eed35faaee63ad3fafc82e01f63b3ce6b3b76d685191a2ecca977db9a7eabea40724e9041bf63a17b6ffc3de7f45cdffa8f1ebd7569725900d560d8d5ad763c7a5fe89f7742146925dab1f2d755b6a754ac41b3359d1445ceeb7a7d5b37ebe9b7fa65ff89afffa37988ffb41f417654f8d4de2c60a67beb19d150c23d04548733fed88f24a6f1546fcd47aba5c9ad9935bb9e9bfd58d30e8b30f1b2de9a5bad71b54a582fb06eaf27182c02c7c8d6ec60862bd14f27fdf0ad1f19dc6b3bddb97e5367fddb077400edd7bca6ae97442ddc825ef523f4001a0ac384a7b5e05fd62b3bbdba56097d9dbabd5eaef3b558cd032988d6d27abddec426c22907b4926dc7f7724b337a69b62633bff6616195ddac2a382e52b65d2b507701f55773b2de3a636a073cedcb9bf569f0698cfdb292c6285ae3bd98614081fa86eb1644c1cdbeeb4f4136b99b4f8fe70bd35fea177fff706c7fbd831ecafa1df7130db126bc0dbe63add6eaeadd7d077fd9cda472e68bc17a1f52897b5d3bfa8fcd67ff77f1488fdeaf0fb5578bd0f730bf02a311b4305ed48eff0c8f743930ec47ae4635ad83f5e7fa68acadf1fab43eaf7ba93f134c1eb84e90ff00bef0baef585e7ffd46c9d88672944cf42e604e910db98e6e5ee098cc6dfdc7f0c841b3627f3d3016386a0196a116400fe67a5ea68bf57b3cb5d7a0d982ce6f72b135ebca696e355f0fd71feb115a0d637f1bafd613ed60d8fc01be9b39b0b48564868be386de501bcdea6d74f4b351dd3666fa4ea91b2bf636f622cc44f03db87fc3d9381bc8500c35db0fae878d476600c0cc978def65e6116cf7e64274a9f075a6a0a68ffb2f485596c6f342beb95f7f178f90cfdb5c899a3af82cdce7833051f306ad4b68d71fd03d635b3d1a98b3a66f82907226c127581477f37f008fc08c8fb3231bc85f04f62ddb84a0c308ca384fdccfbf9213f19f70890b9a19016348383e06ad8c2168a82f0ea0a50eaafa9b683ddfc49ba49d237bc69a49b8f6dffa113c1f11625988e7ef7ea4e3fcfeb41f1d534a1c183c89eb8133e0f837c73c96c34498d958efdea3a690cfdfa49b0cfc81b6dce48ec16fcd70536ccad4e4879b0aead5d662536f6ee13918078bd0df349be96686fec618f486d50e95bf9917e562bbe1a4a1281b5675b81ab5825638a51d378b0df4c5788d1aee37cb5b064ae5d0253dbfa09d12f98304f7a5a0d5f9a8c1e03c1b28a3773a671d53e8077d08c63797fd46d8ac3622569f05ee008a2fcccfdac9057a42d5b7186b5e9179c03625ebd6465aee37eb763efbcfadd37f138f54f45e63cb3c36818fb4d940950cb3e3ef3ee22fe21192af6fd5d1808785735813dc4f827ccb46c61e7a02ac14661c48330b7396dbb980642e21cc88c598e34293fcf9b99dbbdad98eef34deffee630fbeff46d13ef1f9761c5c27bb4a7b1f2642408dbfc639fee166bbd96d54ac47bfd79ce8b89138891a6ff68bf7cdc167b563246d3ed7c1e668ab4ba6543727e388573468fce3de7fd02e43d845c4bab9d47d8e8a631c357573a6f7a6cb339b9e41275398c505f9b4f90ddb6e0f3221d1cabed72ea02b0de6d0c30e01ad47fb077cc6778f26e71adac19f49f34833c3529dafe799c96dfaac929b8e0cbdb1a44704cf74c4f36e376feb25bfd55c8c2d7f32f7f8efe191761e88b8d5fa218a7b378336e3eb77b9ad3ff7238413fce837e87e7ee67d759ae8b5b97997469b61a7bdf5742e4fb5587ad5fecdfdc3bacfcf7c7f87ee6d3e36234370aea42f06b43f36e3cd24809953583705f3121c7a20d3de12f77c82e6d3869285938c0271e4fb36de2954645d36a213a53a9a6c961f96235b5829d06a2bae9af5acc37c8f4eb14e80c28f589ae80dc8b6ec003bddb00a2d6038abc386cfd7f7c97f7bdfd5beffded1e970420e2b9fc86e205f8ec1a7ece547ff22235fc8f8f2452fe52b601032cf19b014ae656da86d365c0eab378fc731c2cfe521ff553c02792d777671b24b38d1ce5c06dd9bb701e1b23e76c89ff89247d4f5a2710edc51ebce023487862d0772e8abda9ce00e9cb7eaddedf9bdd7903db51a193f9113f9b3ef3fa587f6cc3b302c64bf6dda700d013466af9f299dc2f354cd82998430abd05734d75d538a1c896b39f63772320bed14e6a653be75925339bb0e608e9f9c8b8345dfd22ca2e74bf00285fb648ca588e770dc7593a1b3cd1cd43c3220f2a2e7b2725185e6c9c25a8ed164ed3f6aeccf35f0e79cd5d7daf9173cf1ffee3bf0fb92f3964bb9926bfd44f9ee5cbe99f622921b791abecb3399a17cdca789ef15e5a3e84a05bd82f81c4e963d8443483f7af153b9c77fb33e4234530093e4b61972ac6d0536f11f9dded25fc323c66b1f45e74f082b03aa8b4e3535149995e7d790bac81cd64524ba17bff000eebaf1fff07787cf9517289e76a977dd5acfa197d01064de0cad533c9297c82ee68e2c0bd9525ec962d1af7ac8df1acb9c52825896e4b50ebddb17ec8bced2a730b9340e0b3a0394ef97f2a63a697d0ef42da1c7d1c7a897c37591b62fa3cd19c2842445af655956e42dfa9c9dac9a3cf4f2802ab9c47eb9de5fd546fd2ff7e1878e76ce0b74def5e5bd7cd03ee44ff9a8a3d52a9fe4b3dc93fbf21bff4138bb61417494e581fcceee91fbe1f03cc7a6e56afd94bfff37f1888cf6fc989e04b7f5581eca1f861bad300f14c5cbb85feeafda209f445cb592c06c100ff78e50ddbc3c9c95746253ebcb2389a37b31f48294a0634c7fc3e1658f4f7ee41ffefe9777ea42b1142d8fe589c4afcccd52a1154ad1143daec56d3657d0a5c818c5649646cd8ccc50f617f3f49d52f2839b0537a267bc001d5a43b11a0914591dc957145b71a2a1e24a233d57bc6bd934e550f1610624cc0d01df0a9c0313cf0d41be96360498fba75c946b36550273d0e10c257ce08c363a7b66087dcbc5fdbb8fede79984ab5c8b665f89ae93708f75f6876eaac4e816f34aea7bc0c7024d9854733925a369056a395ae9670b3c93be68f95aff7fc7237896abc6430e82caf9b899193cc2250aceb58fbf56a5fec8973c735e9f700975351cdcb308fc23432c43a5345dcc8d8a5a2cf46bfffd899ab579f5ff021eb9254a85351fd5fc7a61255ea9d71a68312a37eeaa1da1f3cbfc348f356df6619e64ba3043a5a1d445a42b948c736258831673596bb09b584ba5d5c9776484fad5eb5ab6c56d7852a658fbb2ed2b21b887f4fce15cd1519979b1324391d707b2e190dd002ec2e4c93ffcd203f8cddf7ef880ec4595e7ab36f788356a6c496116d7c25590cfa464651e2bf12890a7673134c375ac70ee3be5630c4734b57ee63efdbbf591319909085a8ac8fe2daa81c1370eba53cf737bff8a0dea6cdab39a3eb249580bdd732f218bc2fa631994a0050ffd676a3b2be46bdcf9d58ffc13b9ac673c027a90672a5590815888dad18bccb0b10d5e3b2b4bdbc63ef13ec1a07e37797da10869abf1011a94a68bcff5edf27e1db6f3dff79484a0884cfa73289d9f2e64975556b36b683d5faf6e3625f0b06cc37688ba28649e097b120e217a4c83fece67b458efaff0eafef2e3ebfb9ba3e9a85a52aa5537f9d403ed9d8be9f5fd80ebbbaccda6a97b2beb85aa888aa4acada3f16e8b9ae5ca44ab077323fe0fe011dc83079cda2bd8416fa96cf8a5222b8a6b82fec99fd66c9f718847e2ec7b4eacd5ecc273993eb4e3f5733344ab718ff32139ccabc2fa4bdd793c7a5fcead1ff9b5a7f21f39604e8ab25576856d1e816b0b732f0097183af852c85c004f09e6af589aa22a7b669c07d41a9f1be867429dde468f57d094c4d826c01a021b9cd7213a6036b5530e1a9e5bf8c43c27bd7e683be19c9706f345ac313fa915c2f8443be8d18778ef01b45b3cf367f8e4a70e93533e175bddc57a94a09b4966d3a3ef674bf544392aa74b3f37aea17286b9f2300f062626d127ec777e3f27ecffd9dfffab7824c7b9a537e89f08df28cd95624fe9297d2f3394d06af1c82f3a50775bd3dab0d7397c24e3698d615606d45bcc9e975e3f2915661b221be33b9abd46bb6447777341bef4befc381ef9268ebd3f8eedb5f2a60c6628a2021b0efd2cc09489268641664a5963e0e84294c4affc8121d7567651dea7e5ac72532ad54c2a85da80375286ca073d7119970d73cd5df4d0aa9a63bd6045b3e5ab32d28e3857f89c9ba2dadfd1f5e4c7588b442333a93056a12d4a19bfe0913657f865e2b3f78a53bee6babad7fe95dcd7a3abf8eea37c43cc92a0893ea9267cc33a27133223cc3797ba32b9ceb6307e727f8519965bc0b7a00d4a35e05f2117f87f80afd5f52e76bd62a085777664a9f6e2fc2df2f51b9ebbc7911a745737e97601b933d03fb0d570ee0a77ebe66350d4c6fc210ef2335eae1db7ba23b7bea3d35922bee3dbbefc7b7de427ec4ff4d4ab69b7f68de8599ec8bc2dbedc1a57f0216f044b614df58d217e67c32da27471cc29339cceb7a6a203272b0ffcc60c9743cb61d545b0b5ac7ef27971e22a2eabdbd6de3a5b57db6907e0c19527e25f31cec3190dc81dde32c06da01871d76af460debba55913f0e504bf00b717aa854ff5950e07defdd2a30ffd3173aacb4d7efd7bf71ee4ffedac2c8c25bb47f2bcf5221830bcaeb773bf3a2d699b92b69ef1d1ea637dbd8f3f7dfcbb78e4fcb457b71483ae04ed8869baf5b7976b59bdbb0630e74c6e7b85ee9a87eeabad937c7d7972411f44293243d80690eb379c55be0da1eeac9d4dbe920c479f0761ecda6b645b86389ffee835dbffd27b3678aa8ffc04de803accb37e535f079d785ccfa724d044f62fb9ad1d71c4f3ace3dedb46f67dee7ddbd70ff58e119e43ef8126cc36de26b7bdc36cd37a63acc89c2fd7b016ca689b6df36d7151d6e2aad80289b13424aca7755f9964c21b9e63889533c8b4e94e3f007c883934cfdb0a45bcd8a6132d5ec837b6b9c2ceb73fd74ba82f3e847af88abbc6e2f7b3962d323f9dbc2fce4dfaf79ca622f2757c5dd36fdb9ae87d9a2ea0f2ed6dfe8e735dff78eef15fc723cf750887ce708ecb75b4a571e1bdba39cf649890d9e10cb7bdbbadde16f12b94211a2b2540b6389c5a37b6096f577974bd88dbc2dd36a610be17c34ca094b64fc37dfadcdfd89e1ff423a7271d00f23d71fd1759822b9c8ba3c5a5906fe6b9623f2693610d4af023edccc117bc45a625834d8f26e631ab0cbac8b7d3c2f407cdc281b97730c7e5a89d881292b9b41c65eac599640e03fb6a10fbfcd02b039b1e5a8db29d7996ce987df303b8c3a41a8b2255819bb7e7f07c1e2ff5a7a728ec2b4efcc5577c538bbfeb163cd7f2f121323df2d969140c82c9f25ddfdfe2a907fdff28dacab16dc7735bfef1f549e2817f118fbcf60d530c9e5b6a6a566a6c9965c33aa56c08f53b5cbd52ea9447effc53d83103ed28f3fe4ccb02b90cb6ac5f6ee75b0ee18e18c5ea4ebc12f6ebf7ed62cbbb12b0dceefdcb7f785e773cf213dfafd364eafc12fe5d578163946a9a2be4915609088b988909eadf6093891f11e60fedc4474d9bcc30866c762921cca2803a2bcee8e2be703205bc9d1909aacf4e4d6f97dae75630b6f918f26384b74b7a36c9fb19ca76b51503833f6ad095001afc26ae2729d3f15642d1194dceabc37d6daecdefa2b59759c9dd0a7fc6287fa684ea913ea1ee7dc86b80d98a27678c2cad5e98e1760dbc6ccccfa26915f4dda9c69bfe50fde37f1b8f3cfb118449ec2dd13e829e0a88d3737bc56f375b1926b54026d8bafb10d22f629e0c9e916eab8c879980ba82e707b65c2c987b02b17a249b6135c7bd13f039afb6e0db3aec8ffa91878eec803cb6b599863e0707fd9af0664870d3333f0dba973a0dfd2f6c1b3c2710eb549a8fd741c7aef9f6d046c1bb8bac7467ab6cb7db5d281578ae4ba738ddc6fb28f2897b11c5538ebc55b7fb66eb0fb6071ccd01a797931644959ae00e524f79f4eb40c5f60b3ffbdec7f38c53befa8c571c6253dd67184f5343bbf7777cf363fa71596d3f91df15f1b58339955885dd2a9ef292ffecf1efe291c17d6fbe613ff249353360ad53dbe3351404e8959066da11c7cc23f7f2d5236f4fc5767bc63ee20dfac1975bc88f113e16f4a13beb6d6fdbdfbe6df17c2264bfb777bb009ffdabf6fb0fe391bbe65ff73dfb246fefae5d3690b7ef81e59a985735b23597ac46acde0378c4bc23e847fc0ef800f7e16fbad9e88e4faaa4a09ee49aa0b847b428c97470e03f6f87b5a78f2edb90257e046bcbc0fbeaa4e69e0fb34bb1df1cb383f5b9fd30f906d9f0edc8ecc72697414f8beb02eec0ab96b61e2ae21ee10e775c86ce7fb4b3755f785ddfccceed725914e9ab7fe4db1e3eab569a6b753014bfb71dfb0ad6ca2c71dd43be63ca9fd1eeffdfc72383bbd6aab39d50c0a1bae099e6f28ed6822270cc1d658a0103771bcf7fbf6ba1e059ac613ac13d840d8e4dc9ecc34827da4a17fae4e83b6da7ef8ca670346477e2177dfbef34faec3b5febe7fd25d13b1e500e25596532de999663f206d126d4c8e408e24b006fcc2fd083f76d9c0f338549443476fc48c07a241e4c7e9e2606e9426a357ee17dcc93d65f84d55b207bb165107b3d4d0812ef72569673e9079123e79f3b4bf777763ab91dcaa379dc3958d1a19d616c1ebb19601d9ee9f0c9c3b7774aaa5df6b6f3334f95c8975d42e68c10d5d9a7be53bf7b5f4b6bde762eb545f7b84785e8fe35d30dd6b6c49ad19873f7dff023ff2e1ee962f40e8fc0cf7d7a6855445b3e96765ec6ef7c7dd46a8adf7580f1951616e2b2771548bf39ce9b0fda3e74bcf7290ee63f15d76b9d1ab817e4579dc56fcec7747e108f7476a8c35d273cfbd09f96bb0b42d5933226b91eb0ed9dee15d64db43b3cf25437685717eed7c0fddda0f30b73d571cecfc30a75c8b663dd5f8ad86ed7056d2d3ddf5d77017018d08ea441371f7006d4d9d1e7e2dcd62edc45bb3846d73ad0f3de2ed9a5ba2d99cd3c67f38dcfd6d66562b0e178310d66c87f8dba7e91a7ba54e747ee7f6fef13aea77cf125aff511ace34f30c8133f8ff0ec3873e133ab9852f0bc1bac2780a3e9942633427e5e5fe07f138f3c38fe0e757bd285c435936d4f9777597ef02f8b89c13ff85bed1c444a1bc71505dd354bec47065867c4a7768e0e3aba7876474ea99701d1ccc01ce3ae46716a7ba03b3f02d8a1d7fa917fc687d8ad1fd950dbd0e74e86b3cbaf465b17e8a214623f47df6824bed8e0a77992f7e7e095f9f0238f95abc4dcae007cb72b41e384a8a142a48a50bf0788dcd8048c94857bd95fb061bdab164d3cf22497d566bbbaacbde3ee167bf9671e08e2aed17a96964cb18f1ade73644fb92cd7061c71355c82fe0957c234be9c6bf73a72bec437612dca094c6e83ddefe586625089b79be6e750dfcd9efcfe63eecd7fc3879035fabf8047b02fd94ee8de8baddf319c33923665b563626fc7c2ac2662a3b0fa9a6708f54cb3a81cd9fd2dcc6ac4bab96887d86bcd6c75c1df29df8181375b32a7285230370ccf29a274648f3a3de2c1438ff8ee477e329e6d0fb43bfd80dacd779ca1d8f66ed1ce7dc4fd1c843943547a081ef9861ff5cc9bbadbf0afb6fb51e780bf275343894e3b7ecd6b5124123c03115df56988c8cfc0ac2b50381576cb59a0cf77c22a4751d6aa4974b7cea1d71fae21cc8ed14ccdd5ddeb81616012c69769076dbd0470d55dfbdd211dbfa046048a7f58ab9efa5a478169182e0af6f01c4707b4f1f10cb2bd21ee4453541acdaaa29de4c33d2133d1c86c82ff060ef9dfc1230fad6e0fe191673d76f4b3c6235cb2de6de809b5ddc9d50a56164426c85e39e64492e4776a879f7b059e27cc5ea4cf8eee6878ef5fae1edfdb29bbad30dbedb61475305dd0f3c5792f784d73c742affe6cf68f7ccfd6f639da4e5d15968333da9d6df5491f7f57732078a4d336feaeeef0ec5f7e995ff5b47a61475c0df39dfdb8e6fe455e25b3acb6b5c4e411da37143cf79ce4c02628f212e33ee1065728420bacd8d6f2a7993135e696a9bbfdf49d634163c63599de2f3ac31aa0783c1399328faba9d6df1dd82457cc3ed6197ef17dc65dc9fc0638e9e20f6e8ea541bf4b31df7d2aeeee886204852f77276ab73c609de8e77a48efbfc3a7bb7fd6bf8b477aad1f39213cd2e59a5a1d565c3182d91f038ad6d8dd79d783ae2098ee059948d7bc7e6e8eb304f7609478aec99c523416f4dfe9b75d7ff7e69ea6fbdd60f7bed9cec252b715c8ade35afbb8e5865258436bff5cc3f8513cf23aa7e58d3ed9eba9aaf561aeebd37c15d2c38f7345ad4e16ae8ffcaec7efe9f72f8c42e80b69675ab5bbcfb06032f32aafe3eae65ff8b9c1db9769b41bbaa48eb2b1c6ed0e01f43e01ad14a8e3a315ce1bb7dd87b322f942746f0aaaa677c16d360977f2b4dcee46bbb1218296f283ff053e10bdd1c8d276134350e9c40e26fe3959a8c88475ba261ddfcbbaeba29967d7d4ce89ae6a7a55e5aaae1a4c924c2e4ee4522a6821eb07d574045dc175a5673ca03e7126fe6fe391e7b90f9717bf82e70ee139eb84a7b34f3edd4a3ce02c3051b839a916efe319b8a1cc51227aee46b7553b9bec76d09b916e304f1450de262c361fa9185f550778bf5837fcd58f90d914f63f561f39111fe968aa1bb5baed449392d87f9cdb69f5c220da30f4afd536fbcbe3ebdfbbf7211af2f79a36c239fe00566d35533dd5af78f562f2ccf966355732cfa46aae06e4b6cc8fab717bbf1a5e01b38911d2efa957155d4f3c0f92cc1604fdfc262cd430ef85bda5602d7016e54b0f68199b7d8631683592dfb3bd1af2a51aaf566698c8a05c6d3c666bb5e70e9a926a72a9b3839aaad9e643cd3127c20f0b3c2b1de1521a9889134a6a7b56bb7bd56b67a4fd37fcc8bfadaf75c71e78af76f8a4b3eba42ad8d832e00db5504b2fc62a691e5144d66f4e118be01ba80bdda714e8d28a2ab572dfe949f8d6e4d02f8eb1874ca58ea2d6f15459a837ebe6b0aaa9a25817eb698c9ff0c74fe391e7595ff86f9a55abd112adc209e8d43ef980bb2dc675f693f48e355dbee5d23e739ebf706c9fa3318af48920bf6b2094cdab53799bd6debcde190a689fe0ff9ba48e02b320ad11d878fcb39815ea4c655416dbea41cbcd067fdea7279aed72c9e765a9cf510465bf72afb16f5a79b13adff9c927a5ea32c5b9a9cbaa9ccf686752856c6bf5ad1e9a39d4ceda4e2e624fc9d485cf23dc5861bf0575903714e15de60c3d493550baa03b4ec65beba3f75ff1c1ff613cd2f98ef8cb8c53bc87511c5a91f9f0f459e5d5a5c1c3ec5517a1776483b84c4c0414b7fa3ea52b0aaf0ae1bb2108ae36ef7a0ca94087c99c36e9cfa3275717b40a57b4ba52c578aa4ad097d8e6b73a9d949fc523aff3583c6a178f0a848a7107997f67d6b4ab1ae7b89cb67f847bf515f6ab0ff96e3ee02fcf733ddcad867c4ac9858abaa6d4ab1b8f162be4a76c84edba7acc156a31a48a073b26ee6bfdeb8e529c0f6a0fbd1af89e8c71bf0ac9098ed1aadfa872dc27d3e13aae30ee1ded59ce7aadc9d416ebb75c318ec95545dd9a6161749ced7befa8139bea4e55f300f99bfd65a6a5b87e34a51c85e04631ddd0c89f608ed6e665bd7c9d75f3cfaed17f138f747681d8dc06e72c9eead2948467d60da958572956575c493dacd7eaa7393094ac067b68389b55c6462c7f8ccef629130d21d9a8c7e4442928961d62adc54eaf175477ce2017a22c2e9fea2966d4b3da53fbe879fb7bdcf9158f3ccf2ffc2e4efdab78e49e8bd1acf56145a373c7358da7d54de686201b0bd34ecd1397dc75d87fed017c4cf7bcd71d9e725d541765c18a076e02d979ea9b3a20bdf0ea3bb2241e61a5907e7fd0cbc273887de80cd6fa08428013192e7a6ddef08c711be40331678a32d40f7584fc88f9ac4503d1afc1ab6357054c08d780aa31c72a5d2cd4093fd2409bd8bacf0480d75d0c6581de7e4f696e2ea86769095a31045bd280812a7ab8d7f6ba2d69423b33e4ed7e5d7f32f7f8bf8f474ead1fb9fcd6cf38f42337aeae7a7b631aeccd666b38e6d85080055f1898c9a7e48aa6aedd8b437ad270ccea76b5101cbf8ec1365a65a8ef689821f5628f9ef148afb51fdfcde8fa7fb55f8f19c411b576e4da368f4ee07abf4447185774fd23246744f48feffc82e1a33e6dfc467fec17fe14991712184a992631b2ef6a756119cb20b5781225e523c04168e7f2b771d803b51e7def6ef7d62fb3c93c7c2d4fd0a9564fd880ccbb87395bd887ec55ebc2f131e9d5c1cf8b70aef1a42b17696fb3c14cde3bc0b0bf7751011ee1f6ee86a676e8356d7f3e4de6aae3d9ea54b0f0f7de651a4b54d76784d7c17dc6f17fc38ffcfb78e479af0e7eddab8f581e3f0ed1caf63d7eef5773978e6aed986c885a8145635da86373dc5faabe23bb0b2a9d59504544662ae87c1368c0523ef082891623f62fe9fd1cd0e7b8ca131e79cc65dd7f33a3ebcf7d49f79a964b40c5ee667f35eacb1eb3302e5f7d40abfd8e5677337a6101b63e84fc8f70a0b7d76e57fcae3ffcb9f60db57bf37845087ab1a885105915db592d89425db46a160887ecf601d36c74ef847c07f217fa7e1f52ec179f88af13d5a0eb47df969a6ab8b70c7272d0d156d3d77e71b5d7f4a1d3d9c73e7c88702247abf65a65f6d13ede2725e70feee745a24d659ff26caac1e75c87f483070118a8d96731c37fee73982d42b0ca93dfff6faccfff0d3cd2f911ef4f9f4fe6a2929e669fda2e4a9e12d97db12ff795817c09a875eeeb50de9aff1f7bdfb1dd28d3b57b31cc5948c8b63c54465948020133441195500e577f6a570014dc76b743bf7f9f6f500b45a8b8f37eb6765e9a977258627e0f5ad3b048306049de1ad64f7c8225c2f5905bffc8156ff9631e728dad22d98a6f2b4f259697c1a2e113bf01cff18398d8d32053fb51e0f14b04ab9dec7c885e7f3f7f3cf1c183ddcc8fa579aedd8edbda65bcd9971cb7ddc49a3b68ed45a7a595b4f26230c36c417c9d0ea83d50abbc3d366137e86a55d069a05e3ce028970ad36874c2eb426b7e1549dc02e82321e8825a4dab6b8dbeb8aed839c8c286ca6e24b714ec7b795b57dbf181f0f9eb1a9a2bb1a8295ab3d15aec61ed48ae3ab56b15bf05c7ffad3dfa5ff08ff0b37a2be7735acd3014456ab125314f8223446517f005fd41dfd55ae352185ff248999e6dc369d839d440cbe319f29b195d031eb4f0bbf87eaf0809752c05ec29962ec3f363fd49f4115ed3fb9627fc8e2dc5baba4f5e2cce634fd7da60d7d23a801a0a369e34470f722c69ad74ad4bebab83ad895f6974bcd2a67923f8fa0b1ec279138b97a238287e54680f3a43ad1795ecf1f684fbd047b9a8aa0dcaf5bda4a9c2d8f6f0bc76fdae8d883d6bfd80d78305a40ed68fa0d46c40cdfbc027d1f6aa528b43e5007629e120c4f87735cc438a490c83b6b10575b1dee5060a4143aa13dc619209809e62db519c02a9a99eae3b8db98b0682369c9a61077857794db0fca9ad52f8ffca3fc269ee5bfa4892b36c2bcc67c2e4e2a9caf0ddfbca61e6ef506ba48db00470b6735834b68369fc02f555459a0f48fc2c1013cc30c5e7833af11faf1239973c4bdd25b82896f0eb5aeceff394d446c7ee23ecfcb86b42d405b76571bf06d13320771f6bec4e87605b09dcd695fa14d033964c344d4716abaef6eb0ca60c460c48358a7eb05cbf150cd1c5b0730ea6222b4bd937ea8029426ad106843e1709e65710a80ff8786affbb8cce8d39e609396f367762697122754ccc843ff338ec0ba3f9fde55e887693c38b36b18dde90d60a867c18b044efd1b90eb5bc6e79300a9607cdd04ccdd224a147781cd5eb625667fd27f8c87f5d1fe17e775a179e4a4b807d41f803c1ca90a763b059452aa653f6621a954af6a16f1bfb0d523607ac0916e0ff8457e421ea5e2c10fcdc3ac1f12b8aa9fc4b75108de48f8cc56bbf4696a7fdcad6f5685ca90d06ecfeeaf834dda10641ea76d2ccd79407407d1488d7a2fe0a1e8795466fe0ef552da7e54fcefb58edc4b24cf3cf89de03d5444f987f0daac7822657d41dda085ac1762b6d88c7c2f3b2988e493c6d4ed8f81dede90a6f808e9bdbb6ea782dc6276f7b7002c76f6f91116fb567a19bac599ef856205697c7c4150197c676e7baf6522d96f48608f5a968659f85e774ca0d617c5f9f59b82839e0595a517b8d6c5d7457809f45faf0d332ce7f531f916ebe3709863a7f0fb4e9c268db4ca4b53cfac26eb7e80d965ab5e5a8ad6866305f2cafd37dc17c07d3b2ee4417bc916e27b67f8fe93998e6333e92e503a6705f67fe77f1b7182e8a28bbf1a8b47c9d698cc6277913807a40b04ae0fd753e7b9a0b98d3a78eeacf0f12482aefe121d3bae657f151be17287ac547b9fd517776f338d411e61f2361acbb8185f586107c13244f12e620146e6d47216041d271403efe34d4f1eeae4021c692eefb36897958cd0a6cae289e724872cfc1af027e8ec1e9550fdaf585ad87ab223220a7f28825473d1a74a80d32e521a49eb12c4eb1f4d780d35253f4190a00b115ee9789dbfefe3dfa5fd647b2fa007cce7cad84d6f15c42b0a32f38eea270a9b485f1e6499fef8430dee5406f2178284426b63d7db17fd197c3c8912b5d7d35a8e8f106f9836dc3764116b73d4cfbea58a6e6f5d88724a6f8312ff928fe16e78d437a9dd785f16515c6584a79f532f9dc2775f77252316f21a7a61ca1346f3ff187043ea99a5d47dcfef5111ce490c51687e4ffa43a8fbed637ddb1be6d2fb6fa0ead0ba7315a628a51a7f53c98fe56b4eb37eb332292138b91c6af37ab89be833c186faeefb70ad80749ec75ba1e32bb42ccae49f953dc779e5635418d84cb7ad4b475a851a51ff4a37ecae0618d93b9d36a1541d7cf33a45fc4bc5ea2be75e2f3ff282fffff431f79ac0f0499ef7d4eeb6115b1dcabe965bda257175ddf267924f059a01ca2d9a2a9d72ec330d6eb7aa3dac3745919964eab407035bd3978294f859dd8003a8965ea6582e7640aa9bde59e37bc3f3e2bc18002391ad3c899afb79042d12c88f61a2671b32141a0eb1c3a4eea69cbe6f6b1b85ec243d0fbfa489a374e7c21758244379d3b5a7f206d57da623d4080a1a294167a9be4dbd371537b5ff4e6dcf3f16bfb9ca31cd648e9bec421e87e44bfe33a8b45ed4ff83305741412fb551c998146d74f18e99dca45afe9dd7d80d7a74fe67d41fceb54df00de8ef5436130dbe93db105b64c266dcf990cf1337ce4bfae8fbcfdfb94d68c48cc6f95e91c0bccf1c7417f230d2b7a7f6ee903af171474b555ee3b3b0f2d4ea25b740c7da88f76c5056402cd1c176a3c0553bdd6aa361b420130ff84035ed503b1a1c1fd8bf8fd22892bfb7d0c478be838443e077c28dbd7c7c782eb134c2c16b7c5f2cc299a85a56b04bb9dd8a43c312015273c07acc59043f89e1e925c531ce414a391c416a3d76317ec5a8e7b69ac517ba7ebd110d3f16c8ee64414123ded560fe375e507fa6451b273eda36ee826d62798cf22f1ab705d4462798339513be123a15bc46eb659ac7549cf5dca8d068d8710c1f65825d6e33a7bae16a8584f9aea795d0e2e83a65e1026b46e0c0ac4dfb331fe9bfa4856eee7b967d21bdf333a4ff24862c869c7f2aaa53f950fd57e34d29f9d82fe726a3b358802395e500e593497cee9bb36d05a4ccbb12262e7d68daa33021caee239162512eb456b5950bd27e523b290f5a9bcdfd27cf639d19b467ab1daa215e9481dc430e51bfe1c7ffe8a77f185c6067be1dc01cbf049050d9ef9c6c30ceeeebb8ddbb602c4f990837513f40ca811905f32cf358ca0cafc13291f891ff2912c2e22e605e5d7fd4a393564b4f411e505690c35b18f79c967a6a08ba6fe3a112702d33d8289dd9d90daf41a7d16d65b2876d682e06a7ac2022f0b7ed67a3e962753ffe85fa62af86f84d856a6831fe223ff6d7d647c6363e29ff336b6ddacff81c9a994169ae2ebb6a15627ce0479dd45d75e0d4aa841a3f67a078a6b9845b301ff418c6cfd301e17c2b3309eb8e2eb50a47147a2e9a9cb6d868fc899f6ab71657dc15427d12846a3edeef4d5cbc4833c3d909aa80f1df789a0512369783c89a4b24e0ec90445d46159b81449ee63f5cf93fa85bcde7d694df5925291443592137488913153e3b021117f43ca4786643dd2f8283e0e6e6394087f158358182fd6135fdd4c02afcaf801192fc52216a19e14dc47079ba2df8d04bd1014dc83ed831d4da8839f4b2ce06b0cb8f0e2a839a7b110334f508378aa564d41ec8fcbcb4d68cb6831093b8c474d35b067fec0fefcafeb23597cdeebff5ce59908dcff40306119edc7b488e088abf380e4b3edc745d73f3f517b11d0eac0a7b85d595c2a54407ab89a440b4b18e3cb4c1d0a2ac965b8aed5ce79c34779086f21a9e187f912e0c5f794ad5129d8c64954f45d916428b9e10ebd9e103226b3306e1f97e7e5b353b32d7c6ac0bf2170bde283f50739924f52c71e2cc16019a0b1be30def9d4360efdc91cd3f2e8b61ecb6491c9217fcc4738afc07c71a74c9658a791139e11dcf090004b9981d08358afc96a50099ef0332fcc8616329f97426a87ecc066b673bba7a08a7725e66993d83d0aaa164ed6f5a1dd9c525c949fcb43fc6feb2357b6f21b1e72ddb80d65446c52c4fe055a1d790fd172e27a32d9400e03d590d15310d0d392d88f425a3ba9d646cac5532693eda97c294f76c75c50059bd7644f7c29d7b6ad8ff2c8b4ff1ae17731c16c196bc2723139d8b97ed151b71d645cf24e6bbdb1731d6372ec0c27a7edd4b556d5e5e9b0b10d64429c16e721b7b9890fe3b528e608e49183cf9e4a5df6490d68140cd481f79c56f4d49bc711ab59226579e5f0355903f3663c1c67977e8e750bafd72894737187f1c98598e6779834ee4a2c1ce3f51cea4ed96e6788962dd4cef96d6243d3080e32d5fb446160bb9bc2e43c2e6edbdda39e3f1d44824be6372717cdf2bb62c153a71ae842ff5fe58f70faf4285eebad38294aefb8eccc3e67f1bd03ee9367715aa4767750550347a1d594494ebc8ff5003b13474b2cac0e527680cd3e1b21c5365dffb019f42725c05ed19aac8ebb27723de87d3ee2b3bceb2c9607e175ee11eafb0596306c3c350cbd32294f2a93aadec127a3b21aa0aef03c05fe05f91b6a69daa8eade2a6af5492e9f9fea2feff112d0f0299244b343627fc34a82040779258a8e1a935ad011b43b8c183cbe49fd866f5cf9aac87b9fd89f80fe0f087d0f921a93168bb966bc1762b6a2d63ad8e353a22f66834903e5268abb11e5e988e4f0503f0a89991046a568e52265d2ec5a93d6a40dff25a70cfc6303d069889fe9ebea54bdbf47ffcbfac8addc7f850fccf8479656537b499dfd87e235c6e0ef10d49e7eea637dc4075acaf07149ddbf144384f2930be0e882643283da51aebd6938a7ce50180783c4277fad2bdd8fe39ae7a5588dd49753a57e1cf74864f58d8dbb33829a7e8a309eb7ec606b0baaed4f3a642c049724e84f8dad1e993d7b548c4512e78408b6631a97f5f00a982734b6b6d95923a8c253911695d23a16797cd8613d28950ec298d463c9113f12e7919a8d44e126a6e0dac6c56d5545e23319111fbbc5f80a8955007f078dfd055e31afaf62d768b5bccea45b6e3895490f19ab95a82df3ecfff837501f7750f4d7a383a36c4fb5de1a72446dda37ea73c17a4b2dc3c31ec542bcbdbffeafea23f49c527bfa2c79fff1dc805ffd8ee661fb602399757b613774544283058ee7e45cdb86c0de83f908e00bb3f8298275b83f4ffa905747741cc07c67b8ef49be839960ad50daf9d806977e766b9b4bf5ae80c4cb16333c95d2f78b6f07d549695a051e07111c3c868bc70abbacfefa356ff123883e2158fb225007d0bb82d025e39e3b489b0c2aeda64e6275af75ad90f421facdb9b76ec665ddf09fa2a04e54b4d4aa5b6332b473d1d30424e215d3573ca8e1d8ea78ba3d715a8db5d39a8c0726de95301ff03dc16661facb8add8fdc1f6a5c41562fad09f98bf8badfd93bd9c6630e6ed731e523dfdfb82f3d64571e3f95ffecbd87271ad32b38bad46fd31a809cd602af20988719cc72a28fcc18a24e4469317a09d0b632d16c2fc107a1f633d07926949692f86199f19571665ceff5f19666a52d247a15cba1c47cb08ebcc9695ac13c0e4b5cee4b261658c8ea27995c45929b3177f61ba83142aa6fbb4104995dc10cb0ac1c63ffa43c633ea5033e4c269e81e975781ce1a7d7f62676ba535d1cd65db49ce893c9c4682ee3ee748429ce1efa303187e35e30b19009e8aca87e9c4ca4490effaf296a586f7965f1db4f5b7b023160507f5dc4f3b22171c025613f91212289c41ab3e743dc008b09a8323d95efabfbf9fe65c3ff0d93d88b747f523e426dfae6b75dbd0c0d0ee31df98c37ff0bee3f27fa4a7152983cd9b9f9147618c50d863c6fc0cd85dd023c03b15a4d8e377906dc2982cb1ea2574052db3bf658bdf85366db0a19ad02f999c73779497f8b8c06173fd4bfdb96d0aa728a654bbe037bd0ba88f52989f2388804a4b58759bffbf47338dd840746649ca11320039383ba3753743851f0fd048ff9925f4ac706d4a6653919c5741d78ffaad617ad73918d8fc43b4c8a2bcbf5a3c278a49d0f0dce7b824aa33c793544a78b5ed750050253b372417f0e4acbc57cd9888ef5606808868df5c25ec727b9a2704fc8be56882db344b071a85f863e6f49d686f3f994e7673ffbc8fe243c11afc783f5fa093ec27cd779c0b91204630a67959c57f94bf8485e2889f9e920e81f1668d9c2b414b09cf65bacf922c852f2e84ea38da011819455df631a3bc0bbcb63df094ec7700cb4556cd7ef0b11d862081d2966fb9ff20d42b38c8caff9f7e815c8de70bdd0b9a0be6f2c83bf4ec263f3b8a37d82fe4364395c1dc4c744c6e5d2069f392dc3353cc33702a0cd066040e2713add0045552382f82abf43e2a0ebe4590ba65fdcacc7e7d600f77fccd682de4b5b088dc88048c6d6c69aa2a90a050d8338a86e4d072aa6aaeb1250267cfe835e3fde0891313716c652ab453d6305fe9649cb88d527e2b3c7f2015e13d0570a44ef845860acf788af7e531c0deac69af1f711e00513cce01427389fd96bbf6e57eb91596781f21171295ec465f9f45d57a16cd7f1eb19963943b1242af87a1103f81e3efffcfd7b48a888e5a8d80c6b2d63e3be9ecd6e7553eb56cfe6e5d5d89e06caaeb4557670bdbc2abbda6cf25cdf1b3b633f792e6d5b4f67e36ce2f7879e691c7bb5453ff68d53b53475a6ba581607c6395085f2f0153f2bc2fdde93712cc5157e6d8b0e7e1f90f7bfdfef36be06c605ee639cc58150364a623b6cdaedea603c72c6caae2ff746ced4289f0667d39942ab769c696f74798571f9a14bae67d3a838cf4615b79a513f1bc6d67d353646e3a85e2c43b117e2b46a607a7c5177b89f67a162346bb9bbf5f8d4fc6b537189e7bf84e703ae6c5dfb0aea19adce93d18e24a323148cae88c44658367aeed8e8a39a31c073aeee9b9bb2161b43dd76e7c6c8181bdaf942ee1b8a5343174b35dd98188661469a61cd3b6255ac18929113a76245acfacf0dbc1e46de16c5397e2eef4fb2afecc6c7f757bc23eb51c2eb51baff9ec85aecec7c5723e714ece74073c742e3f6bb4fdf1fcbacf3ba21b740171950c9a422391d9a71447debc02f681c2da9945677c698dfc894a740b613fe3cd7d1b607a3b031aa8b6d6e7e5c3d41cd93489daac4463f2658c289bc4bf84835e52fbf3317777c644af264a0fe9616d48ca7e80919fb8d5be4bc90d46591086a1c4187a0fc91d62fdc6f6ddd78365e4ab3cb08f205d7581fc1745a191dc6afa182fbfd8279484e7c1437f0703dfe747db3b417f80a58e1edd5611be591d1b8ec87425ed860c54a9c380dadb2757d6d8272db8eeb373a467199335e97727030f142ee66d037acbb0c493ee265d26a08ea2614d6453bb0aba6ed0fcde9568943c0c4c1bc8461b25cf3e847bce397fd97d87548317bb2ffe57c246373f99ee665e43bcc43ee7cb89fbfbf3555e38de9b8826b1f2f4e9aaf11b11ab6dc86853f077d05c9e780e82df8f4e02bde7dc4afe09bc87463bc13679a6d548ae7fa3450fbc2d01fac26247f2f2231ae5979378be5f2ebf1dfdb50a0d9ecbfdcdf5014fa8b89e91d36501f12aaa45eeb1f1c6988ea57745cbda1e96f0bf341138fed325174b788143330c392c6e2a3cca4eed72aa38ff01cffec7a7c768db90da90ffe8fe55e505b15473123943b16cd594d227a918a7a68b9a821a594473973aecccd055ebba2b93457fbaaaa330c8285b06acec1df6537cdd850fcc2ac622e3cad550d63736d6ecc6d65a00e49ecd923fbd6a379ff75dfafd7e3917fe436d6f3abafdca643fde1619ab72e5edbb5fff43a16a2a0bb1d3b12d6044b199c59e65fe73c24b1fce29d75b6086da6df23822d68731f3cc93797cc9d531ecd268766653b6bd6471b61ac625d25b17b64db7bfdbbb7eb831f1ef2576242cb9c0c06882e8cbba7f30c698cc7bdd0dc42379bb1cbe2be4e05a8bdeb74961d731f6319df9bed8ae6016bec8de6c8ae0a1b82b14f6d4360fb7912799ec7f57ac49f9fffccd8c8180856d746d899c745099fd893ebb7907db111c45707fd295a8ee6fa74571d967bd1481807a5866062c151999825ac63507b9b6996cd8a59ed8ffdae7da90fe60db376515d7fbd4146b8def6b4a359ef0c83fa4616a90f6b78d31ffefe23eb93f28c98db19b3e3f90fc46b7d017e92b08b0fa5319ebddd350e3bb509dde4f241547af16c222945eca1f54152bf36c52244c64e85bc0bdb404bb331747dc025d4129affa7f390d6d5e2f141c1f55884f1ac8e5a586af469fe08f58f507f07ede3b10498ed4e682ab1b8761c1f8fbb4e2ac315772f9ea7283b24a86291208d87894f44121ef96edef78fbcdf6efdf3e433f021cd836dd36c3a4acb325b11c48a99a43e952a8c04753531db7382cb295c74dbecac43fba526da0ae17580d10c68e60bb32b9a612bf2cd9ee2a2e5ae0e58f64ee7384146e084b1269be0d30aa88753b89803a1f9897549e3b5aee6e987e2b5f29973197ec867fa3bd7a2edea27538daae8f53201ac7686117815ef94a9e98a4fc6e535392190476e93dc408e8dc8b0de81ff101e642d2a95cafaa2063d77b109fa899c9bc5f97daf9f8f62cfde880fb2d146d87b48816aa1a47f535e8724c5dfc2a7a47eaa994373847224f2dd823a23b4aa9bfa12b7cb2ec44751bbdc1bcfe75834a97fe44fe7ff36ce8bce0df1c197dda03e3ea0e5d634c7c146d4a603c05f16c610cb4d304ff07fdd93520acba1bc3304d1ef884f428d488775e6bb077d2f6f6abde2fae9729abd2283c42004900f641ba66eaf829adf9dd70f47c1d9bab5ca83fe7cc4f79e5d8f9b79fa71bc5f3fc99f7eec8ffe930634449b068ee2f4c0ee9ee0cc321e91a901c5aa9039e8a8a5bc85d528e419b5117fef319e4268b41ae7f08a4c1a07df16780cd72dbee1fbe3bf6e21e6a919ac1681e6db4bc265e998c62e706d381d9079e566b0e769ce22ca0122a9699a560c91373364948a247a536dba8be3c226b8ec0477fd2a1ee07ecec307f9ec7fbec694a7f0bc12363f41f5b8322533a73c9d9b44a7537de89f4cbe2739f0eed1cccf44e1321db87bee6387ba88806b4031edb526d4061bb42aab69c951594dac27b0d85f2cdf890453360be693f91c580cef86f6e9a37804e97a84f7ebf523f15a577c84d41ff93a1e22d1fc6bdb335f2607a4ec3729b608cdcd835858ea4be7f9ded04e03f8cd4d4dd86cadd84c7d3f8810ac587855042cb40dfc019177ef72247f8b8730ba456ad5dfce03f8f7a363ce2c6e4f9e1364b05478ff68ddf60099af16de04a705a921d50fa0f6fbab653b4a7b6e4de7f5040be0513faef9fa57ad73966667e3a031cfa84e2d6734b390e5964b5ec7f200cf1feb5e225459724f5837e37c8fe3acc9cc3712531d4a387aaab00baada5c6f2dca9e087a27a688b96d68e75673cb0f4a806310f4495cf31deeca87d6e7bfc347bca4fec857f1119a170d397f2fe6da51a9ed278b0eca30123358bac04752dcaadbba5099da1950c539ef74fc3996ffc177dd3cd7b136cc6953c068ff9ff3915bf9d7649f17a76a8c355dac673c25f9ea290f21f10180177c76c3a515d018e1930a15d53c77f5ea9c2cb82fc44b9ba476e4aff848b61ecc6779c8db9f17dd832e0772a93cbb7865b4d4032bf2517c2631c4a476cc6824f4049de1ff5f0017056a0840bc318b9f0ba71ac4500be3d5405943ade2a86acd26136bae55774aac12ecb080e4a5f271ddd626f8081ff977f511b0a75bc2c65a58cb6d27b16185090275b6462c93e74f832bcc914c4d7186c9ce790ec9eb23b56cc565d551763b4cff58ed5ee663ff58fdf0c7fa404ab7b2f4be208841390efb6dceeb32c810781c01ab8e8024279c69d60a2a5b5b31e86187de02eb4fd6dada001f21f16616f1e1ff828f30befe953c24c502e0311480077cb1b6e2c86f8a5a75ba8827aab5b3f680296c1dace3185927eb6c5dac521007fd6edf2a5f287ecb7e992751347592cb78045d4d5f941b5645dd9f0f655918af0dabbaeb9e8b0d79aafa6d883f7ec0473eba3e26b3b9fe3d3e425f878f632b3fc747a61ae48fc707ab86163c7784e777d37ae3a94d88fa15ce262a428e1eaddb41eb13d24a6820f7677f4fa3cf1d778fa598c62bb16bad32b822fe27facde5dfec3d081db3eac22a9ad8e3a5eb84691e09c77f677cce77004d2244d04f2f56ac06e8521ee41ce62e6d82814563cbb27987f7bcc4177e81f7fb1b63f9b5dc2f91186a88a5f601a1563980ff0468bead805e62295613b03845d36a59ed4177a352ec15c24b006b4d165f016f4ba45829da56098391e137209f51341797de76d1b23a8497787fa48ff0f5881ee10bff887fe4868fdcd9a0e54fde1f6ae811fa31f31b4ba8cbcb6abb862c4337cce661505b5569cb7def148b84d7ef23a7e325a9322326753bfab6b1ce1f1b80fd486282b97f57fad0f81ff1906b3ec2ef03b58189dfdd76b7258a2a9de853cc0647fb0b35aaf00004f4dadea2d7a66b752b12d4a9c2ff6954f58ac8f2290b19bcdcdbfe92f78c8f7c6e7daffd11fc7edc0746b0b7488d12826943f4107c52b0447520fa862e6a9642ec58f9cdc0ea05155e1b86e4a500b6641474a1d60cc36e2ee2359878a0f5c3ff9fbacd83d31f0a2f565f88ee62b3ac0ff69fdbf8b27e3bf6f97fc03ff2f946b19ab06c6b0d46fb8ee1a8e18eecf4b0b44675a8539eea23dc3fa2ec782c708a4be5dde82f697e06d411b7546bf8a535c3e51bf937f593ac484d95d11041bd956bbcdfeb1a56ccffe363dea1375eac111ec76be03bad522d3404960fce302c57628ae39bcd7ff1bf441ff9e81ec83e279dcb50947725a88705362de6d309852e99a328b4acb18e16dd7a8efe96e58f0496e697131ec6f371b2b6c6dfad1ff3dfce67ffe495c43a59043b508d3b467127001a35ad1d6be95c9e4ffc232ef58f707d84dbbab21824d779e4c057f6eb951da94493ac2739871fb199dcfa0faee577ce47f2599a07d9621bdb9a2c8bc013f9e978bbfe08f84666238bf80d02a2d9037625d69b4067da91fc4cc0ed6d5826c3b4029c196e931b8af18facfb23fc0246af49866e84fb89e7d63d0b3ae073d1fc4cdb8d46bd796bdbd48eae655d2a5e4330302fc1bc43970575260b9be920339fbfc245f8983ef55fce67ff5c5b313a0039eed1453bee512392c1777e963df7da0fc21084d0d9e4b569b9ad886bedfcf73c7711decfb4e0d0c909aa7bbc19cb676af565f3a7398de57e17bc0314c3519c21ca41f4e23b188dbe13d8862559b9d52be82fe869bb1f3a80cf42fc2d50af762068f3a5950f4a09b6628a67f2185febe71ac92135cef8443401331eb09a859ed09f07417555d83e59b2eb4fcfae5f9d5b05821119631dc48a07d653b5bfd389df3e13b777358f7fbe1ef77ce4277848f6acbe455bfff46a729f2c96e377eec17ad6dafe12d0a7a18ef8797b25cfdff2912863d3cad641cfd06a246d0fd64bdfa810bb4926b77efc41cc8e473c33ab8f0c33bc84dc4f8822fd3c9b8d1c15f20adfc3468138e09358db2d5b4e073ca0e80519914e6ad4939868b5ea0fce5dab3808062b82a32f676c3fc32ff48f7c74fcd77a1a9dcf1ea93523063d41b55efbd2b822895b4d1262c5f14f1ddc909deb9eec80c45e032efd042dd78df55379c378626a4bbbe655bf2be3fcbd7cf6efd547b85d85e03b2df7a5bd64bbbebf74dc704773f26ef511c8678728797e2238cf48af19dde4c55177f9b5ae53aca74b6227bacde3fedd26dfc46b65e387adea69bf4639544c6b0afea2f990c74ee2bbe6543f193ecf8e6c3e227518b78dea79284dd1727eb69b22c757e4f8c4efe1fd7ef7be20f6b7491bf303f0afab235b72247c222457f2249fc6660364bde44b584723183263752885da042952341b6c3ce20b7abcd7386ff9bdf578c447fe8feb23a224a67c490efa912acd56f6365a1602b4acb2cacf6fea23a9cdeb210689807f279f2cb503d854d331d8f933fa83f62179f73d7d64423ea7f71c9398d9281051eed421080fefd71f817c7d1fbc9c247f5fddeea5b9f24ceeaf8dfdc9595a48cb6a17e5a49514635abde7797b8c177e3e5eeb77d65fba6fb83f23a28f08426487d23aae3bea4994b04ae67440c74258167005a4acf33d57daf6c5e6f362796a383ed21c655f5ceb780c79a65b3dd67bfea78f646806abd1de17464155bd48bb46db691d8377f4113809d36c5cd7adbc8f8ce5299a417d26c8c7e098b5098dfaf318602effa67c84f126df1ef4a5bde75e45c4ff025f0b501f76c5dd4b6ce39dd453dc296025822f429ed5a4035a969691bc47ed8a5d1574e1487c3bbcffc18fe8236f6170d236c712e019e2b87a6de9b8de1dc353c7b5a1162fd6afd4c0078bb667873bdb388ce68d755b3af56ab108b1ce8bf25ab59e052d890f33eff4bbdff18ffccbfa488ee4f0d17c085a43ef35c0dafb6a229dbb2be62f79531f6131b5496c2d8bfd4deaa3a3fab6b3b200b716e47862cf4feb61a57ac457e92384f609d17ce7fa9ed76e5ec56b3dbc927111346d4c6b8d8b215da412c4024cc7f89444adaa6d386091f091b218082ae683fb4407a0cfbbfcd0badff3113ede22d68f6c3b90ca52656220856023cf582d9680c900533f829ac1d3b3a3686ba90a9e6288c6d99fa5da2a60354d681e89763f9f1fe8e7bfaf8fd096f57b838f415387cd50aa435ec5aff591c4f6c5a20601eb1050500173049968696f85b158049f2ecbe3cbda4e3eaf8f5cfb0e08f661d331f1eed87d04ef97e083396e8c1ca5931f5abd813fc03c0fea15ae7c7b798e1145739d56a406c1223eb1dc498b3d6bfb037ce47a2facd8fa04b42619e42d4aca3177d687cf8eea7904cb86d4f9a231d840ad880586d8f0f0096aeda734fb6c6f6369ec3298cfba4195d63161fb80e36ff1b8e7df5d8f7b3ef27f5d1fc9d0271243c5f80944c02d05a90979eb6feb23895d2bad2515062160bb1f4be4b356b3bf6a506c741697ca69e3ad2ef4a7fac82dcd1bdb6edc915a330d7ceaefe1fd128c46c0d66acd0fbbb2d40eea98875eb044b5174df7b02715b0b19e124d5fa225d4b067f585599f084ee377eb2337fe1091d45e2798bfc162238cb70d7f30aaad6ca983f59002f5479df38b0a3e251027e79078b9a42631f00f56398244764add5eadbf8923f740aac61593980e6e7fd4aed6eaff677dc413b33535787d5bac97ec8b505ffc57fe9124e6374ce2a1a00e14727cc07fb2cded64e9b0fa4bbc96ac250449fbf3fe5efb474c21e14d04fff77058393dca237ec94798f5fad851ed38020c76829bdbc17d0d8eb975b9b1869d64eb2b1b7f5724f14efe8feb2357e306ffc654f5edf8101fa55e6f3128ccc7e64ac2a71cc92e9e77c80975181e3e791df29a2a14678ca079708ae6cfa7c818d5e7557528682810a89d2cab8f7c948ffcdbfa08af4b42eab0cf9f12da8ce5fa7aced96d4feff84742763a927828826fe52f5d548fd1e8280d8093d37b529fbec87180b53b5bca9fe823d2cdef8a24876fdceb2163e9beeb1f81fc1675bf39b9dd1389ea83d8d7fda02eece7f5c9795f02440ba75529f437f356c6bfc3e5eef10fea237c9c58ff68484a5552a5617537ba0c14db00f177ed80c714a2fc594e285e1bfcda3e983cb7876211a46b466483572c9de5ba457d3cf4814f666aabc8193ef23f7d44caf0111e0344e4fa6d73d446c67bfa489233c2eba35b8e8ad5015f1a1db6ed36c144817bae8412c3a8e7314f9fe9f3adfc9bea3710b3142887f3f818711ef82b3e12207feeb907691f90ba90b41e23cc45d4306c1d34db96238d01db85e46a5cf3ac9ff58f907502dfb87b50b7dbc9a8eb885009c37526cf9b95e303c6318d32e5fc9de82190496d53fce64c2c047b0f36af7664e72647499b0724ded94b629e7f878ffcdbfa482a4f67f32200cf7c3c0d241d2abffd3a5e8bd9b4d8097102a7e5349cd3caee4e572bf740f13c80465d76c23123e78e699d910f8dfb3df9f73ac60878e078613735ca037f19af45682c3ef1cab1067c848c9dc4d36eed66d511301fd1ecdcfa15ac0e84cea6cfcbf2f5ef5e773e2ef22c61234d7ab2bab7f56595a057b89b051d872b04335ea188561b5a237a4a2e7352b53ba10ef03b86b1f9825e912c193b6fe697dd4c7d95df89abfbf7f5919456a4762d598884d1d091cc77f491eb18da0e9a38ca76307b3ece84b16f0bd99a883ee623d45e92faa93f8e5f7e3f2759ff48d6be35277913bb993f9d23e37d7d04f8a26b5bf23e2076aba3b014e2738cefa1b63a688979a25ff29498c6c512db5c363636f8b27cf677f9077f0ee0fbfb83c6ab232eabbb97cbdc83f04b6b6fc37a78f6aac56a036770c4a8851e9f9029d81aa99dee2c43f50cc6537cfcdbbc535b99a53dc3adf1afc6f97bebf1888ffc5fd747b2f9002c8f0cef14c85118db7dbc4b24466f33fa48821b9f8df18dc02b15c6aaa088d2845440aee39d7680fc7282b94e6bc3d3ba7ff0ec31f1117fde3fc2e38de4840f022616d61f26e7e919d0906e6391794be2b53a9dfa60b3ca51bb15d6d6f7b302eee7585f0cb761bcdf853ad4a467f5d4d3da9372663d7e62fd135b93ed369ffbeaba8fea47fdec42cd94da0c34f1433745dfa063245868799a3d06bc9ebe67bf1320c68054f2f3e13f585e50164dcc4b9dccbcff8eaffddfd647b2bc04e8704920b96bf360ba3a6c889d3d93ab0ed88dd50e41302d82bc4b6befc28a1c0347b93ccf7ca801fb90fe3ca2b75fe11fa1f749ed72f01efc3b3e5aba53a89f48ebad03af031c2d6f4671c4f07b1fa24f2469d1df2aa4d621e16d0ce7de17764d3d684a398811c8c41467fbf135f9ec1fdf07445fc4fadd585adb06c49781d67dbcdcc6cfa5793c473df511119c7f6a874cb16cf0ffe1a48045b8373ccfd635c0f14a7c241fb53d92ba637778674466f827f4916bf93ac1801576b65bb9d806e47d53bb08a33d60632708a60e44a1385e24e56105d6259473ce8b81ed339a9ecd55fb6cffde937f25669383ef207e0bea6e8c56f261c970b6a6a9be742cb9583af14490c32f12e687da60b339637d0374241dff7708bc643a26363893e681b33e68896ec0fbf515f85aef5d535ace6c6a8218a9a3dac2253cc0cde20ba419650c9b46e0717414ab99e5f7739920cdfb213ea245657b6eb7ed2a7d168903b3584de6b7628fd31ccd1417e5c656f98fe823d7bcc4e7f2e86a22c93191b452dc131adb7b3659fd114c8f1795cac1732ff3b9b3d1d0725d4c68ee77cf49aa8f58577c847c8fa52675e92ca556e4a84027d3bc165acb0ade877bc73f06b63edf9178325a4f90d7e538115e7461b55252fc965b5c949fd047521e4fe9b52ca851d47b2e2d19be00d30f337c82e81d503d228b029ed82033ba18f70fe1efd5a56be7b692a0c2f8af6c5beff310daafd91d3e41f08fe823fcde59b997c8dd52415980c60ebe683adb1c9b11701a39dd6a87581a134aabf616e5a42745c5b2fb7dbefd67c7fd2b7d244bcb24126ff644ec6796303ece94093269056db21ba8871378c8133e21aad2468af41c6f2295e48b3c91d83589e94d58a7811a2322c7f84d62a31facc777af3b7d2ef35d0817c189c315ded1047311af0dd8193d86f742eaa73074a48a7485ea94da20134bbee3b2982ea2c13b6de925027b16f0e4ac5deb57bc5d62fde27867d97e8f45ed1fd447b86d4b16a278eb28c76ed6dece69d151a379ed64963bfe1ceaa63b7e5c1f6f96ce959de9cfed56efb56cfe489a8bc2fd3b24c70350d7e6bb4e03e5c9ee493c693086c0777cdc7f75244d2abeedae5040fe43f1f979bf69ed453affc544cff97a7cad8fee013abe9510db4d6138f22488812015228ecfa9be48f52ee01b903792d4850c533e42f495691677003c8f1477c0f7aef8c8efe26b65f92c5d9be23fa58fc8895d9cd885963be975596031bddcdece6c41a701ab26fa9260cbabbb53e5d5ae66f2daa41b9fed77e923a92f387d1ec57ad934a43e660d4e6bf54a24ab6c5c1944f775a6e7bdb7b0833ecd6581382d7a1f62c3a27573b544e7a14dfb717de49ae7335e29a8d2c06c201330fe034470334946db1a793ec98c83fa309ded096ac32478676e6aadcfc66a9fb7e04781caa94a636b462ab337666d85b77ac86dbfaee31e12be0b717aff8c3e729b13087ef6f14075fde3255be79c790941fec5f22e541c5ba3b3dbde3a6a4ec8d9b9a9d0e7755cafe27ebe674eb2fa48d63f42ea30127c10cb6e2a879c93438e82f5279e93081ec357f4ec843977ad747242d49c137cc290611aae12599cf2ab740db2afb3ebf153fe91745e0361073e128881809d4ff197d725c21b7d778a29165ebba8ea28b649ac2b2ac14913a9fec2e2b692f53c98e809780a928785d241c8621c7f540ee03999b7f2c3bfa28fa4be544a33a85d285aac73deb6933921bc462dc38d27b510318dcaf9919c0b769dde19eab7b25cef2c4dff2ccffb883e92ea53795e5b96bcc7fd693e97eb4e036aa4e0fee3b140e51e67e0a887cd7cd2038baf4578ce85f8d02516f3cc7410c045c93c4f13b3f5477e4a1f91c4ab7960f6b6cd2ad8ea9b06a9e80afe11c21791868cdd732e3ca897d3c93b1f5adb5cd4583a95dccc36402f838c64f091c01c2451a860c900ebaf671b4397d8f7ee7dfb591ef2d67ae8a290600d6778c93fa38f6469c78cd455b782ea746e1b409b127b3a956bfd53612f202908d133601c2a7abb949bef269887c889ffe07b7908a5ef541fb9c583bac3a10aaa81880ca73777b0bc1d9aaf4ecbced9fa69b43cce03a12fdcc6eddedaad7eede7f949ff48c29f09eed7408876b930f697c013730ba4b9bed4474bed3ca9eca4a04a72d707244a73dc1b542fb9a5ebeff10102ea009589180e338f9df0372bd76f1fada1727818bb70dd176ae7e37863f03a809a59558bd43fb9890bf8a7f4112eeb921c12afd7772bb1d3a6742acd5727396efed940f5dc0ad50307d363e95ccdc55e0f0580e974937ff0207ee71bf4917b9a9be6278ee24e67d328b9fea6d141b9f5f445933571e735ebb90d44f04dc734de39fd7df29cdb79bea5a13fa58ff0f173fcb09860116f82de617e2a21a55fb48df373242d8ddc363ef9836829447e8763358ac4c7b110ac5d0be576b93de137aa1380ef9d56ca20b99a3e324ea361a82a342791e4fb643117b3e3a7f8c13afe4c0bcac05b853aa9bb05f52907f75837ff9c3e02f60cc0ffc5f26eee903b625a738f9785b975eed43ee7ceb9cb78e47bd5f305f9d32436eb2ddaf3f573721d1f748fed91e0d36f54370e0ab37c2e8e437538f3d5218925037ff28a8d393b07bfbf1e3fc547b8ff8ab6fed699d55696fe126f4a918e84b13022bea928ebe722317298b66baf3363333a147225c04af16cac7f402cb04d7df1b972fb3cc4648fe993d49ef7e67c0026817014bc5c85d52b29da0a60d8072ac1f7baf1a7fc63fa08a7ff80dba8da5b4774ba1c7b916abb6077df8061be0ae8fcb9da255e74b74a50f56d51c3b323d2e8f16f18f77bfa48f673fe7cce174ca077c2c64650a71cefa031ee27d8de8ac24194585ee130f3fbb778f4ad4de76fe823f0fc1c5d23c0c9aae766fe6a12548d9ced063dcc1701635e26747e2f925acc80cb88e97c4ed4fc5e14aea4c1663b878c5e88705c2344ea5842fd32476db7832a99179edb93f5ed5f8d1fe2f0c4d154130d6301b5e50591d48eb4267541102e57f514ff257d24eb632739e74b6777e80d1d35883218f0e01391b0c0e2e4ea585b5ce61aa131070c912e96ebbba4a6eb6d3cd39f61fe7da43dce677f84ff4b6b39d1fabb7dc8e1034469868beb135cf5eb9a8a6fcbe16fadc7f7f291ebbc47163f0d3638884983532f0c720aa3ffab441f4c7542900ba02689e7db4155192ecd5cd3f12fc5b9437cf381a3ee1d641c874b9b6153666317565763a557c8640e21067a3a40d3a8eb5794833fc57a4f84cf488a3b96fcfe9fd047f8fdb86d1bd31f1bf5835c0bd0d9180f11a87d1d7cb7b3113296657c42dad16c1212f9136b87c4bf9de735fa92fb7ea53cfe963e2265e8dd98bd4ee76b94e4d6913a1e50731db00a99ffbcc8f0e1adccff86495c564a43ffa63e92ed03e80a47c6eb8b986f00bd2f0a62ae436c8a75d6ef27c24358aecb4aa5f54be07dd00baaad4aaebb5f23e3b02638296245dff6b603d75ce648ee089b0fc0b1c9cc41c6a6e51ec9bd087ebddf8fdc5c2fd70f0ab901d661c2ab3a586cddfe117d84c7b4723e620ad1aa60e7d6253fa2f6776ad382ca03a79a6dacfb3bbfa535fca14c6bee8912c3e93059bd8bdfc5f8fbb339e1fa88ff40a7b8a57f21f17ba4d8ef3ef3a97b045f3dbd278d75a5afafe2bf7eb91edfc947a42b3ec27904d11bc97864e2db294fb56088f9058d2d83df66ec4e09963cc4a3c9f1a151885f14032d5127a7c6addc30378adb245e2d169603ce0beed72e995b52b784c6b2f59d67b4aca27351c8635d644bf26b6e6c8cff843ec2f908a7c1f833dbcf8d1d83d8b26c6affa048029b783d3dcd5167331aabed31a991fe94c439c98c0e65f59b8fe4b07d561fc9f29107f679f2ff1ca931cb7f47fde8f7bc8ef3a27b3ef277f5916c7ef988f61feb199467138c809c26529c2da8035ce4b8f1ec3ffc2a133e0316e14dd00daabb56346b4ba5d2c226f98751326f746c5a369fe86e1d0097c511b59c9e9b9cd63923388c9fb7b6f694c9abe1fdcfff33fa48d63e84e9d46eb1d49102158a0f26e47b830fd7b59b1196b0cc455718e62c8237fe995aeb9f6df7f547de9ab38f7dfee8bbff863ef2b85fd79f953f7c2fa0f14477710f801f130d499dde88c90109de4046af58311e7c112566c7c2ba085eff3ed489f7cefd23d4fb0d4af81e9704a32bd3ef7f421fb9a19d801faf09cea13370310f3974793c694edaef4fe3792f5245adcaf3f1a42feec79fe8235fcd537fd58fbfa58ffcea8a1bf2993fe42d1e9ce181787d0fe4eacc9c9191cbd98b5c1e6abf8bb929d7ddae7f0fb9a4c43626e8605926759891d75bcfe7664eee15375bafed37858d3025eb71175bf1cfe823595bce4c9487935ca16cd30a37145b03e5734fd35dfcc264d57222f7fe2d3ef266fef45f588fbf350769fb081fe173457414b04186a15f9b95436199db9549fd9205a9307a3d4e562f136c8350af17b708eb2ee3a6140ab9e7fe93ddcabd10dd04f399404de622b32eff843e721daf9587d8d7a9bed9b93dd7869ab3b40e0952ec7caeb86b092afc36f79af871dfcf47ff8afebdc553df8a1ffabef97fbc1e7f8b87b06bc247dee2c1999c50ae8b093551eb54ce9dc5292ffaada99ae872e9ff595e08bc9f8ef16bb0a15d367650ddaff242def68c0dd6491667f195f8db8be296e87cf0ff61fadc7f421f49719424e69b8d8793580d84fc94d51f111d3576367ed90b3bcc0e547ed0b79f6d6fe239fd85f5f8eb7c446cffc6ef434ef761cd67fb7117744b5a6397fae46fc64ae2a8217f0605e517df6e17e68363b5b4c83bad50180b3bf195e0c5e0ff0995441fb9e5233f4533be4b1fb9c150124ee293dfcca361df518f5df40ab821c3853d8e2eb64bec1f580f017d84d460fd8afc908f8cfb2d9efa3f7de49a8ffc8a075fc75bd589afa587db147800c43e63f96140af573c135fdd13f58b6ce4bc9bf7ec5cde77957c20a8a41e4091f89a004b672dca577e2a729f7f461fc9bef751900f072ff9c8e94532444d0f17f9596916cd76136ed710a7ffd34732ebf1d7f9c83bfac875ff68ae25593fc39e02866691f9528aee9eadeb35be097c2f432c567eae079528efa32596ba35d1f2a19af88ac566acec86f0afea23927825af8a6301e517f96554a0b59db0b4d552c5ed589a78bde980c9ab75a8bf27523ef213e37e8ba7fe4f1fb9e623bfe2c169fff32cc640c327a49efe9ec661257e113eafa486b070c152b61a96f32bc53feca7e614eabb6f885f5d26be27b85fca5387e973ff017d24f5e326713a8d553e6e1f517d07b1a1a1e3c792539beff2ebb4ee14967fff361ff99f3e9269bfa58ffcde38a534d71362b2c02702f1c5a46e7d366f472635869358eb749efe097d449a3f919c9121f7cf06d563538b91444e887b2a389dea6287661ea317f83f552343b77e62dc6ff1d4ffe923d77ce4573cf82dbcb3ece7d7df5fc72a108c66db05ccca1bac4a7ae57988d97c24f99fd047a41b2c254bd066ddfc46f708ce2fd4a3ca0d9f979a7298aa24d694fc4fdd313ee2ff4f1f11fe037ce437fcecbf3bceab9c4e21ad1d63de7c270991886ed623e5233f4533be491f813c3cc24758ce403008aafb97fc561b3bbe13389d4a65631d7319cc5ef85f9ddab7123ef2dde37e8ba7fe4f1fb9e6231fe5c11f1de735364a5a0fd9baffbd30657cc4bafedf3fa18f2c6ff4918b3070e3dddea9ed44a7634f7687fc2ea862f97325c42e64ec04583bf3ff3a1ff99f3e92699fd047ae72cfafda639cb43446fcfa7fb01ec29b7ce4a768c677c66b59694381989fd7abfbfcdef595c63cd7dafa832d44bd4990b727026e8a26d613ffc8cf8cfb2d9efa3f7de49a8fbcc5136ef7cb23bde3d178d358f0340e8b3f67987c47df833e62de3fe71fd04752da90e2a21c85d030f287c5387f5cbee44fb10af97b4286e730bb96f43f7de4ff943ef2d17e3e8e7f4ee280d97b9a8793e27e65f1b532fffb17f491842f319a02f537f05513f2f973fed218e74bfeeb5026d8b79737ed5a3f4d3b7f5a1f798b160f7f431f796b9e1edb941ef2f8876d9c598f4736aa8fdab2defa1de70d3c363cc5f3cc8e2bc58dbff9ff8ff0117e5e299651561ff96afc117abf25a93f82f9c458ca97f3957cb551093bba9caf2df75395d8346475472a15737ca59fa0dbb77233f0b1efc4d07fbb1f743d4c9623ff317dc4cfb45fe9008f5bb60e318fadbbb231e1f5e0fef3b7f48acfd4307e340fb7afb3ebf1f3f85ad49ec0f157c32b9af45534fce65eee49cc4f07e29350135f3b55af7d32267e589faa0dc9eb410e5ad52438ebd7f2e8775e6fc74a5b98e8443fc543a49bf518b3f5784ffeff55b3def99f2cbec747f281caeb846570cd6eefffe8391f6dbfde9ff7eb91693fa48fa47c24142f0fe8eb17d36a2126f9de34275a225827940ec904fbc4237c84d22c9fd4e9f8391a7e3ddeefc288b9a7e38f6833c43c0576fd837dffc8fd6faf1f6bb82fe292c54c3de2236fdfff16dbf2adf6d1becc1edc2fd547beb371ba4069c325433bd3bcedaf7806cf1fa1781a9a38142e538de06f50fb46917c4e9f6933ecdbaf7afec7fac7691360b7431efd85f4f3279e9f6d2693cb095db6eb1ff84f5e949379cadfbc7fffbf3c07bf4a303493f7599e6137d8da980f9ff5b167bc7d7d7f6d603d86783d86f779453fc6472806229ccbe8863e7d3d1fe1b488f31022f7428d756141f29d57c289f011f21dc341f9de764fd7a8bfffa7f491ec3ca7f149b43dd20f6f9b7cd756cce7b07a976e4ba4a6d692d91497fc7de633a85db948d6427ea71fd683f6b8ef69ffde9f23ba1e9707f7a27ce4573682afb8ca62ca4786552bc114e432e7573c272bbf9a097ed3138b0386185f8d60f031fa553e913ee493ff7ee7f8effba7114c90a131bd8a0ffacc75fccef7e93c6b09861869f9fadd7adcb634dee96d1b5cf6b7fcf743f1de3f71cb43987d89ac87f98bf578b44fb8bfdc14efe7f851ffdfba4a045b8daf8776751f6ed72a635a52c634eddbae98932eb16e1888911818174cc323dc42b1fd35f787fbe0c6de0b157169378472be413e5f62fe5912eb6239af8841adde08f019c5fdc837f1ff9658530c4401f7e59bc79fed1f3c17ef8836ee179e0bfcfccb679f0fff87f97ceb3ef85991b8166336efb1d8c6cf0ff095ac87a8885311b146be4f7e37157ba4f9f83b3ff90d629fc3f7118c0b7e0ff7c72dfb9c645dc4a9b085f742b9afd1fe0a5b7a9faa49fa875fe75bf8bd8bd7c91185db7e90fb07f479ac5f117d3eb9cff5efda99e7b6afe7fdcdfd73b31ed97d09ff4ff8c8773656cf95e82143c126677528ded657fad3767f9f5cf219add9a493384fa0514fe2045fa13ec933c593bda2a13fd828dd223cf52be6417b380fbc9131e2f1f271f2f520b1d24a89c41d4cd89a641bfb1cf2fc48aedfa3f7e9ef9f32cfc9f64583385b524f8bd17e786d7b42c43ea3ff7f26f7a3b5638677f7cd5e7fddccbbffbf3fbfd2cd7adcec871fd447680b983ef2b3fe658ac9047635c065c42ddf66b96b7fc7cf4d1bcf57f8ea3ed07a88728a2322c4a4663dad590eef8fd44782758259adfac0e771af5370fc5d22e333fc615e7791e2f79e389600f9ed8ad445e1723eadf7118a69be798aed2ec3ef31bfa7be970bc164a4cfa37da6f79ab3c6c7e067740dfe0c6a174bf19a3976fc47e7379b3f92693fa28f709990d2ecf8dbf4117ebf3bdb382060028e2bc95bd626ae1005a6b099d721db9f61ccfe843e724fdfc32fd347b27a42f619f8fd322fecc312cbf7067c749320e81cf00e9c89b978f760ceb84d88df270f35ef670512bff0c4e82ee5cb45c8c9110ee435a9e58b9f738b332933db626a83c2cf104412f340d64c3860699cd8b4481e21d45439e2d725725fa8c37b209fc5640cfcfffbc45e16f35ac2cc2e96ceaff6a1f94df7677ca797fd1c1f91aeceea4fd36ba85bbe82bc6704759f76826a5735f3b2c977f25da57a87a3f1530d685ef42d7efe55621b92d99c639a0c7e21c05e67b6218831003b928fe5eeebdf4b499f78ecd22c638f9ab3df917c72527f71c19e49ff47b1f72d429522e69722cf6158f184cf08c7734c4e288d89c03c41047ba39fc18ca73c875d134c4d93f08915b3abf98cdfc0fb99282518fa9cef7dd17a103ef2dd34f4dae6417d99d9cfbfeafe6f359afb3c52abd1cc5cf883d5601c6bea2a1ee255ccf732f4f2bbc77f6fff09bfec39591b93997cae11ec5cd353817f046577253898427860e773576201f351a09d6ff139763f12ff6602dd263adc13e0ed923a5163767f9954d5d9807e11f46c77de12c6912a8c176b8243b3d17d71e46d883ef1446a585589df2a8fe79ed81601b3a4f60235dba15f049514783be0e36be535d65b3cdbc59f6ffc8ed72375a68a3cff03f051c01f063c86d46261ef3336b38faecf2d5fff793ffb5bf9235f1daff5b8d17ab383a05a9ae6fb8781ebdbf238dc3814d552f879be96d2adefcc1f019a5c64fe21a0f93d4183da82c2d01f28077fa03d939ddd2f439cc1bdcf81c65451ba4ee47f42a38b04a7be2f8c822adc03ea69cdba04f710f2c4b5dd24a8c6dba3d219ce4ee3c3a23f9f98fe7c725c4e1cfcec1ea9f3e291da2923419dd7481d15a233f8767e405046699e79405eefc457f8ddac8bfb7a094b8dd16e01fdc7cfd2d86fe87e2a126cc680e8313cde2bf58f7c7c7fdeae47f2df1fca1fc99eebef8fd7baa7d99a80f784bd8d2a950aca39bdbc9ac73b05d3bd5122df7eeff81fb534ced4fce4fd6ffe9fc419e858e2d181b60b634ccfc7929a1f356bf9f1d03d343ac361c57ab55dbf37ae82dd0930907913a6f8f4e8995c3d9361eae39dbbb1cda3d71945b6badb6ff543e3ac4dce7b6d30ef29bab41ae4b555751f579a613c50f2faf4d45f9dfb4eebb019945a1ae6de95b8bd9ef4dcd2586d35472b2b3ae527ea36a8af2641bd75995ba5a95ae89e26e75c3cdb1ecff8b35dde681879d37a3e3470bfadbce48f7a9e35693ecffc4643186f1b82ba36bddeccc37d2c10dd83e92384df5defbbf7d7275d8f9bb5fa413e42cfa57f95aff0557ce43d9b8c9ccfada47c14db9e7b7e723adb95dec1f4b481bfa731c23f35feeb16629efa1dfa08e8041752d703eac5ee4afb5561bc6977cfea76e574fcc051679a6dd85a3e7f3ecc06a367d0cf0856885acf2598211ac311497ddb94fe8f877e6e9e97d1325fb00dd4705aeb81b6e82aebcbfae828b6e5fa3b11e5b627545f56a0b2a7d34179473d89c8e80df34fdd7369624b8e32f15c5f2d3b8a53cf3fef7aa6b82fe65fa6b57c942f22e358b6f595b88d96bdfcab23b97eae19a0c0418a3646caf4ec280db1f47cb196e77543162b17c9392f64613ab09bc0a7887526d58d3ebebf6ed7e36a9d3e943fc2fdab5f41534da1f288f67d01cfb88e191d52bb3ca18b58063faefaaf4e6f8d169ee322bc4ab22d061b526f84e526de8e97cbabd9f6153c8ddf1fe45e8ac3a1fd525ee6beea6c9e351fe398daffb17e01f27f046325be08ac6f44c24aeeb5b74250a8acab3b7bec5c8607bca37d5a47d0733ccff16dcb51764779da1ced3535b8949a23e7d01c5d4aabe7dcb45591660b3ba86e0a54af001d23345579e7c9ceb18514a787958417f4eaf9e815aa4103fa387a71fcfd86d44a7f452fe809ea17e3cf425a3f9da2ca220bd5a12625d457a7cde99c6ac89091e31fbb91dc8e1c1f2b1fae3b75fc5307bdee378abef0d6c8f3e700dd5cc4cff1f1772ad21c75db414a472b3daf2cd96d0ad124de1c9cf2aa7c943d6103f341f598a42ee23defbd97376eebc164f3d96f65d16c5defac7c9a7e9fc6ee5899989d22b36d739ec1e85aa6ae50d0d792fb5ee713143334959f7d7a7f6287279826f4391db8129b8c943c6f85f901b7ab139ab755647fb79b3d47e6317f29efcb9806f91e02543ac76d394b4d0ec45762e7b9cf470c327dbeee239f0f29f98fcfed3cd01f4cbf13db3df80b660556af89de9b60ce82c4e2db7633b4e4b01e4e816e5fd873c3cc98a15f17a8614e6573ac0300ad8c092e2df1f3802e013a861c4d8abbc232528ca3b393b6cdad1287ebdaba2ecfec1ca6d9e2ba6febfb29a6e712aaf31ac3d0f02eaeefa7c8d837918126b899f835fe1de60198e6db7abfdd189ebcf9bebadbc9f25c5e4cb6d54d13df7313c37d3c179f3417ef5d17e613ee8bd895d52ebeba666a1a939a94b7d7f9f46cc209f317747db2f783f750cf32fd1cfe87ea709d4f497d4b63273aad4bde36d683308e9e9cd3ca9d9d6cb51f970ef25218e2b54b6a66b1bab932f511111bdb2259d7d43ff2988fc809bdd4ee68e71d3d25d876cc66228ed8556376067206792d3b567b28fd2fe52379c0c84b1a7926b197a7e71b9e4b7609d49510a97ccdeae57903669b9778fd55627339800d1f9e3d71e515eae54d390ee3852baf97036d305c38eab104330d18f2fdd56e1fd4831ed61ad39c85bbba796fb66b1a948e5522f55fb98ec36cf6b88f03db0d62a0f3761077826abbe30f1ab2bc91b7f26eab3a85e3210a5be5381cd98ada6bcbfb5debe0ac5f574f4ab4158fb5bcb9685ed6fbf9a23b35a2705ec374fde45554dfdac9db716165a1a57c6878f2d1360e9bd171ddec9686bbdef3f48cea40c79d3ed0f16c6d61a80b09ef1d17e839924e5d07d1faf59e803f17e077f0b9d372045b6f885d657f6a94e4d3a2525a627e417eebd1fa9282e7a6f7fdd32b9c12273c0dc83539c1bf7b1fcca74438654e1fd5b727a7654fd072ee8d66f259be2c26b60bba4b80e76e6d825d0f743588e583daf6ac2e31e5d961929b9862a9a47ce43ed7eb6ddb00b55d333b35b78fc395c8c1ac0eaab06035e7ae65705fdc5ee5b4515c2c6ec7a7d70bc3c1ea131bc600eaae0696d0c3f235d4952d62da3b20f436e03589927e503cf1fef124975a553bb7779d4eb7ebb466235477455239d4de619a746af4633306ba2cccb97ff8a1eccafd06d6ddf8c34cff891f9bf59bfb81e13fd1726f377713d4558c756b3b5b2b95cbd23c8cf7e548420b90df4f2b3b87e5efdca621976b2db7e134ec5c577594a86a1b3b1529589ac03412193196fbe58aa31c36276b591c3cef4f8ee2faa4fa696e8d65f593e8dae7279473dab651c67a02de25be5ba47557f889b86d40db6157d566f834456ce7b3069f631a6d2ccab621576c6336723aae434f08e121c9eee6fffd448b40fa3a6ac01be05e595ef7d1fff33e80f4e716d1ebba84a5bc3c9e8f2ed6bb4c8495ff69f5b4cabf46d2eeb044520ff3ee3ee5c7ac5e09958982aa2164eb60b25800c2476e6396eee5fc5bb92dfddc24d887cc4eceef417802a9972a74494c148bb711f64249ae667308001b8bd5404debd9be08d1465e6ce55a77b92efaa3d9935cdf3841bdd108aa935050a3a53fd814ecc0efd96e43c2322720540e40ef00f9d37617f6b078aaca8d4dc3e9c49856e20f552c23e39de2398147b8b6222bc20678d0a07eb9f533f3bc81fbf8d4ebf1b3d7980ee5f0b8489e3cd4f303dc2edb55157fb0b0d7fa20aabccacd4525aabafe768f0c38ad5883ad2319cbd4b2dc22fd1389dceecec6a4de16ad058c8056af11dbe5aff01b0705c8899c0e6e21dead2a8c07d3fed76309768767b7b7f87702192f9684e084042ea5f5b4a6306d641e444a7b815fd416f85e61c263e0f7c813e13ba8418c4f5b07fa4aeee993e770da1dc2ee3ce7f10efd2c2fc1e3b9bc523e02f3403fff0d1e05f52e23ce0be9bc8124e84df17b1ff426b788f98ced78280715c7e5b6dc91bb728fca434426e232c2e54a5e6075de091fb9a5ebf74dba8aff9f5fc5efc8ccf7594ce46a8fc8d16057b1589dba22b9d2f3da6379d437d8de98ef34e9d9750f72ff7894b7fda33cb08d460e8f4a8d9f26c38e793ee4e63b6fdd528cd9f37479cc6f476b7dabc5ed714f1e0ea2997f9c355fec55bbe26aeaa9abc8234c8b7378669e306dc1b486ec0e1774927e551e035e38f0102c97fae2bdcd29d537aee7e191fd8cd77e0d7c5be8cf03596b75965aaf379a48fea61c384ec79fa3fad2c527a048a41fa071f563c9b5370bbaba0733080f265ded2062d291c0e83ade9db21e844e3f16f18e342e81d369ac515d9e805c7ede9e65229f3fc1ee3d5e48ed6018ef2b919c42b8774a736f6934f42be5239c97105afc047c17f7d7056d1c346e7a3af895d26f72423ecb4742ca47ae7992f77bf788d8e91758fd642c2b1c75cf5ea3b943aac622a042e8153d3bea668f96f95d1ef4423d8919a33ce351bc5690f847ee73c3241e170aafe74f0fe92acd1183bc0c380122d402025bc2622d8c83ae1d6c0a78b77bf63cd22feb4533323a43d988f4682e9bfe201ad2264d84b1eddb41d915d48d8ce5f62e5822a3d9e6509137d170295b918c34646863644455a7851b9638ec5cb83ab8ce652c4c5fa62fcb812ced7a726e7ff0cc6304dfd9bad290f3e6080bfd2b3c7bde793b9c7be2c1a4bb06d344e570c67d061e5865b6744bbc9643b36dc8e682eb1fa71b3c27fc5fbf236c56137fd0aa18c572278cb1a66c38116896a9fc8f5ea81c7f960f3dd8195e2817405f38cb9486e32b3e31f4f76719de7bf6aa15ccf02e0fa1ae23ee3f3e194ee79c87131520321e52ef113dc14920bb01f409cc2bc33dbe0f3e6da5f547f59144da12fd19d05ece3328f63ea1cd02bb3f97dea2ac0ef137f511ce1be93588d83ad3f9861a664f5083c6b6b0045b959fca65f9797126fab348e49fd47698fad933364ec647a42b5eb1baa193b7f23ab77145c466be035f68531feffc81fce20f94289cb4b6d573abda1b9ffafb72658965428bcac90bd75176f9d2f3b20872b55c742e7271fab2569426d865167d7b355d58cfd3557527bf769583e7741dbfba845542af67079049f1aa16b09422396a9c43468049219a603979009f23033edf3b2887306dc534c327920b60c70b9c2383b5b1a5f6ebb206f5bc135fb4959143b3e37ecc4356496c299d0755186e9b0d63ef1f06d3722cb1d380980d660e2b05348eb5d0f1b9a4521003043b035615687cb8872bd71fb87e809ec0928abff7033cfe70cf258b7487111a0cf70ca1b21d3e815802f3222c9961698956defe953ef290b63fd113017d3f6fc9fc855c12e2349ef195e26fd2fcafd647a80521e527841f018f83b985d7a05fd986e11484825d98123b225ec35941e860396295d1bd7de1fc48a648fcec599b70d64f3014537bd798fb1ca88f539ae88b8d24d7e393bd2a380554704fdef274d8623a6f5cf2207b3baabf045a4a3936ec1864d5167827779099b6b881944b3eff241fc15e1fc6abae53d13705afe0836d06aff634004b23e6982057027dc0eb32c33b0decef1696bfe13dc89ff87bacadb9e43b44a40f87d312b23b4192c1f73cf69cea3a57087a5867688f83baed635e46721c6c379145b3ba47d6d6c6f806e840c033836e50ef0cb7b3c358af290df013cc9d6607e4613f82534276a840b4c9a720a2340f788447d0ba0b7c77c3dc10e9864884a9c421721b12fc1fc6e7711b14a3f9a067c1fd027c7c024c32c8ce06393c24a72fccea1f8ff59166fb863663bec6ee4f6c5789c61fa6f7e1fd02de82c7f957f511bebefc9404084ec7394ff82d3925784fa895e24a3aec0575e2420e11d61f63634de4819467e489cdf5813f8bf091d4f7c16d4cd4260f7e5615da3c1034e5303b0bcff6343e8dbcd6766b15a2b3ba2cdab9fdda366209d3702c11611a0a34de9f4f31cdf7c0decd46cdce37d08acb2b9563a92c4b1bfc9ef10003ecf3a93d9fd1083603dcce9edacbf93d6e6924ff8f77fd5e60d283539a146668316d14e6954b45b45e49ec9146b4ff5dc6276232ff0fcf45a0be67988f31c42b95a6ca7e3b7314e8373eed2ab1d7733f4142d3b23ce1da26741ad0fedfdafdd3eb233f8177e52f603a4bc86926ecda3562cfced2d837f511c7bd93ff93f94ca4aa30194b763c7042844ff2914feb23292fe3fe96ec7df03cf9836a6181a5fa4818909a8921b7c3c2ba92f5a6f1c9ab7c9de8c4a98c40ae704682186cc6b6bbdc91b81ed5ef79bd6dc31fac27274dbd4ccebb5c7fba1aec76dd526159eea0e5be64e76c0b73f2c0b5b194f3ba2ecd9df696d272624378b9a301219f6507952336d361429b984d82cac0995345393ee501090de3b483d39aecbd38ade3cfa77238dc33b111c1ff7cc705cf993b75dc53cdd60bab423c538de274be97c695386cc0d84dd09348bd3c12c31aa9604bf3074b67d1517d7fb444f3c9f2d42b34da2e9cee5412896edad58e6327988d11bd0c57888f37f3ffab6b98d2563eafe915f833b1e5d88c6fb8896d873c1724afcb9ccedfdbfa483a9fce1bf3c95e474963cf81138279c96778087bde67f491ec7c5cfd9ff40f7f2e14d62bb7ef605d773c94abc6bc777050af10f4adc2a6b0ed8bd602ebcf95a0ba38cfdc799dd627e18ddbb566fe6235f367c1cc1ff7c77174a95e1aaf7b7f2b1576b9165a821d7ff78c4f85e9b41665a7b377c01208f23e9c0e7cb48a4e86a6656968b6517a091e1ee0aa284b0313ba91da24ae572a43cbb2f267c227e07bb83fdf25e4b32b5e85180da6fd839d51d8635e05b4db38bbc4429c6b97b096dde8f50b877e6df6b2f797d6f6793e695796fa59dfced6adc9500be7fa71afbc84f14eb08d3dc2bcb217c9e12ecb13d395a6cf83f1705e91f208ca63090df7a9bfe1b63da2a5e91c65bfa3cf813e807491f161cf818f004f794c93aff4912c2fc8f23ffafae9f1e79fe11d99f6497d24bbffb2bc968c9bf054f41423c9d87bbbc3c92bcc0753a4409c59b98096856363beeb1dadf9f8ac7b466336deee83fc6ed12d9c826a7c9cf95b25a80a433823f3c3f2e47bd2cbf4657f1855edf140b17507eb088103367c6a1bc7a7c1653a80ebf9e0d304791faf3f3fbbd7a722bc692ed54960366a67d04dd625a6574cb9fd9ef30cc2bd53da754fc3286d4b7cc2647533df319e1331793c62cff5186d89e84eade393017e8036a6bfe08f589720c6084b7c58dbc72706fc184604deb88e6d542ab6313dbbfef44c74acce097c159ee7b6b76bd4ecec5e52d93f634312186d866bc49e1f71bd8ccf47abc6b460361e2effa7361a4621c25bdb4d665e927141fcd3355582f94de693edaa3bffc8f99af75ead673adfb7b6acabefffb27f84f1e6f4ca780b9f7f3ce73102cb11329cc1dcc9f96b447830023f13f157295863c829a3c2b9302b5cf6457c128a2af2bdf9a139d2443823288769a21a2388d1247edbfaf9c9516763c73d5e1cff58a23617bc93ec700f9e2c2ac782d512ae819fa129199e91364eb3d02bdc07cbe0aff8be99b3ce79c4ad7d22c33b6eeec767e65efee47db9d23f485c4f96d6a3e271eef4a9dc8ee9af4f251af40a14002802f70b9c9f6077bb36c4ae626ad1c17a938ac7adfa736a33e3f145f7b49f3f1f766896e6798cd6319ff02bff7f627bbabe267a40c22733d4827fee513dede13c5ceb0b6feb23cc5a9a95096e758fd0bbf9fe9a6ffe79fbbc7fe4ad383126ab105907bcae78bc4fa97f271df7a9e0a89b18198552806658afde33ee40f563382364957c90dbc0fac8ffc9ede24043ce5b4c2b67f86ef8c4105fb00bf62168a9d5f10d9a9f440950add415cb6dea95ca9cf53b3d223b03597d86495391e3666850fa5ec8d05c6aebb0b99c4d6d1c74e7413fce96e316cabb17f03d107b5078e882cdc87da1fde0fe01b8029520d21af8ea8964e0844083a99d8cdb78eeedf4ac1f191e91d5a3e05aa8b82f092578bb3de2cd6172bdd95137bc48e0fd794b1f69d5525e71adefa4a795ffff46ee4ffbfde73c84dde793f15a0ffa91ee0dba8e6e91fb4df83c0411dd1f845a415c01ea169ceea14bd69ae9d53056382364d7ab0ec227012293b12411109bbde30ee7e959836b10b1781d81d01c9fae42966e5dd39d2bf93aa2bb13ec5a49cc67422baf6942a23fb0d8d2eca949e57c6edbb9b5d3dfea388c96735e454e49613f072984f397446a497c18d9bef9099d7da17390ee5eeaffe0b6a6ab79b896fedcf4cabfe776addbf9bb6f9cf73c1adff5b8bd07bac507fc23199e91b59dddfe3e2befffb62ffcadf6e978adccda3db41f524f00f13be1d758ee09f973980c60fb740e3a856a2c6299e17a9e23382359c906fcb507137cbc984f902809f0e17a22e12f9c265139cf2676feab78a08ccd292b8f73f999ccc6e525195596268659b996fb4853db441a63caaed998d32bda7c2bc7826d07f314ceabd80ec2fa889ad2f05b9a7b6dcbc1f4c649ecf0dc6f70a527dc3ef796d6dfea17d407ee45ccc6776bef7fef9a9ddf69f6fb0ccf0a6f9fcfef9fd54740a26cb6d335b8b9ff039e7e25e727fad307fbfdf0ea7c501f79f3ffd736b82bbd8efe9fca09c9fcd769dc424a7db80c505a17c2d56b90a16c74fe081fc9cc023f7fb7b4ef23ed2d1ec2cf23e51dfde5151db891161edc47f8d3e767696b761cd097d653626df815ef7b6f4cbffcfc767cd7dfc3f3fb724abf7ffdac3f698fd6f5fa7beaafe2fdfcd5383ed2bfb77eff816b04fa4866d7fed17d3fd32f12cb50e727f59ae7133e42ef267edb95f11c90e3035febded3b46f7efed595ee88422dd15b7ef8f974dcc0a35d11eb23e28f8d3b13db4bf535e2d79fb556f77ad4cfcf47a1f6b79ecfe603bcaeb3e10acf4978dd0fb778cb47beb351ab2ba35b7fa12534a30e748bcabde83573727eb4c1f34137fbfdf8a4cf376edbf9bbeb91ee8b743dfedebeb85e0f62b562b63eca47bebd17228b454afc23577e951f9b0df02390678710114efd143f7f4248d439b5f145d46ff303edca4a4b6924899f93883e721f13f0014bc2573562a1794dfd4677fdfe81f9a1b184a72ef363257632c4ec5a8fe284bef29acc84caecf1fef73eefed7ef0f70e3a9b105706f91c7fab1f10730027153c9c3f356efedea5fe1f9fe78ffc9df548afc85276d01fba1e3fbd3fd2f5286dd3f5a0b62ff89ec85a1eb1f9bbdf7545cc370291daa75a7d07be6cf23d6fdffcfcf4ca7d02f83d450ba8a7feff1fbe7ab033ea1bd2971f1a77ba1e6c674a8e7aaa9d7a576bf1d3f3c0d683f0758951b0bfb21e8eef0c0aa40f10af909d0b7246486e1cf88ebfe74a7622c40243d667a73ba0f91fec7bb8aadffbfcd437ce9f872463b3079ff980d2ae1f7c3e9d0f89c43a93b93806df3efeec3c135e4e693641475097adfbf9b9b97efbfc2099ae07b258ccf8c379fbc6fd89d703d6a1d0b85b0f1515e08c9cad56ed6c0d57df75755f5bb5daac5ba8bbb5e5b255506adb53ef6c35dbdffddcdbeb7603d7cab1beaf2d0bcd6e5c7787c7f6cb4ff7039e57df9daddaa2eed60f8546e5f8fdcf3d75cf56b790cec3a95bda36dbb5355d8f9f5e87db2bac47fd4cd703e685f6f7e79e5f9b9dbab5f5ff9b73797208223e5cb361f2cee54ab5d65c009db7fe89</data> + </pixmap> + <signal>signalTz(const QString &, const QString &)</signal> + </customwidget> +</customwidgets> +</CW> diff --git a/core/settings/citytime/zonemap.h b/core/settings/citytime/zonemap.h new file mode 100644 index 0000000..c9c2035 --- a/dev/null +++ b/core/settings/citytime/zonemap.h @@ -0,0 +1,157 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#ifndef ZONEMAP_H +#define ZONEMAP_H + +#include "stylusnormalizer.h" + +#include <qlist.h> +#include <qscrollview.h> +#include <qstring.h> + +extern const int iCITYOFFSET; + +class QImage; +class QComboBox; +class QLabel; +class QTimer; +class QToolButton; + + + +class ZoneField +{ +public: + ZoneField( const QString & ); + void showStructure( void ) const; + inline int x( void ) const { return _x; }; + inline int y( void ) const { return _y; }; + + inline QString city( void ) const { return strCity; }; + inline QString country( void ) const { return strCountry; }; + inline QString code( void ) const { return strCountryCode; }; +private: + int _x; + int _y; + QString strCountryCode; + QString strCountry; + QString strCity; +}; + +class ZoneMap : public QScrollView +{ + Q_OBJECT +public: + ZoneMap( QWidget *parent = 0, const char *name = 0 ); + ~ZoneMap(); + void showZones( void ) const; + // convert between the pixels on the image and the coordinates in the + // database + inline bool zoneToWin( int zoneX, int zoneY, int &winX, int &winY ) const; + inline bool winToZone( int winX, int winY, int &zoneX, int &zoneY ) const; + +public slots: + void slotZoom( bool setZoom ); + void slotIllum( bool setIllum ); + void slotUpdate( void ); + void slotRedraw( void ); + void slotFindCity( const QPoint &pos ); // Find the closest city + void changeClock( bool ); + +signals: + void signalTz( const QString &newCountry, const QString &newCity ); + +protected: + virtual void viewportMouseMoveEvent( QMouseEvent *event ); + virtual void viewportMousePressEvent( QMouseEvent *event ); + virtual void viewportMouseReleaseEvent( QMouseEvent *event ); + virtual void keyPressEvent( QKeyEvent * ); + virtual void resizeEvent( QResizeEvent *); + virtual void drawContents( QPainter *p, int cx, int cy, int cw, int ch ); + +private: + ZoneField *findCityNear( ZoneField *city, int key ); + void showCity( ZoneField *city ); + void drawCities( QPainter *p ); // put all the cities on the map (ugly) + void drawCity( QPainter *p, const ZoneField *pCity ); // draw the given city on the map + void readZones( void ); // Read in the zone information from the file + void zoom( void ); // Zoom the map... + void makeMap( int width, int height ); + QPixmap* pixCurr; // image to be drawn on the screen + QLabel* lblCity; // the "tool-tip" that shows up when you pick a city... + QToolButton *cmdZoom; // our zoom option... + QTimer* tHide; // the timer to hide the "tool tip" + ZoneField *pLast; // the last known good city that was found... + ZoneField *pRepaint; // save the location to maximize the repaint... + QList<ZoneField> zones; // a linked list to hold all this information + StylusNormalizer norm; + + //the True width and height of the map... + int wImg; + int hImg; + // the pixel points that correspond to (0, 0); + int ox; + int oy; + + // the drawable area of the map... + int drawableW; + int drawableH; + + bool bZoom; // a flag to indicate zoom is active + bool bIllum; // flag to indicat that illumination is active + bool ampm; + + ZoneField *cursor; +}; + +inline bool ZoneMap::zoneToWin( int zoneX, int zoneY, + int &winX, int &winY ) const +{ + winY = oy - ( ( hImg * zoneY ) / 648000 ); // 180 degrees in secs + winX = ox + ( ( wImg * zoneX ) / 1296000 ); // 360 degrees in secs + // whoa, some things aren't in the best spots.. + if ( winX > wImg ) { + winX = wImg - iCITYOFFSET; + } else if ( winX <= 0 ) { + winX = iCITYOFFSET; + } + + if ( winY >= hImg ) { + winY = hImg - iCITYOFFSET; + } else if ( winY <= 0 ) { + winY = iCITYOFFSET; + } + // perhaps in the future there will be some real error checking + // for now just return true... + return true; +} + +inline bool ZoneMap::winToZone( int winX, int winY, + int &zoneX, int &zoneY ) const +{ + zoneY = ( 648000 * ( oy - winY ) ) / hImg; + zoneX = ( 1296000 * ( winX - ox ) ) / wImg; + // perhaps in the future there will be some real error checking + // for now just return true... + return true; +} + +#endif diff --git a/core/settings/light-and-power/.cvsignore b/core/settings/light-and-power/.cvsignore new file mode 100644 index 0000000..e6ba7a1 --- a/dev/null +++ b/core/settings/light-and-power/.cvsignore @@ -0,0 +1,4 @@ +moc_* +Makefile +lightsettingsbase.h +lightsettingsbase.cpp diff --git a/core/settings/light-and-power/Makefile.in b/core/settings/light-and-power/Makefile.in new file mode 100644 index 0000000..8236ed0 --- a/dev/null +++ b/core/settings/light-and-power/Makefile.in @@ -0,0 +1,135 @@ +############################################################################# + +####### Compiler, tools and options + +CXX = $(SYSCONF_CXX) $(QT_CXX_MT) +CXXFLAGS= $(SYSCONF_CXXFLAGS_QT) $(SYSCONF_CXXFLAGS) +CC = $(SYSCONF_CC) $(QT_C_MT) +CFLAGS = $(SYSCONF_CFLAGS) +INCPATH = -I$(QPEDIR)/include +LFLAGS = $(SYSCONF_LFLAGS_QT) $(SYSCONF_RPATH_QT) $(SYSCONF_LFLAGS) $(QT_LFLAGS_MT) +LIBS = $(SUBLIBS) -lqpe $(SYSCONF_LIBS_QT) $(SYSCONF_LIBS) $(SYSCONF_LIBS_QTAPP) +MOC = $(SYSCONF_MOC) +UIC = $(SYSCONF_UIC) + +####### Target + +DESTDIR = ../../bin/ +VER_MAJ = 1 +VER_MIN = 0 +VER_PATCH = 0 +TARGET = light-and-power +TARGET1 = lib$(TARGET).so.$(VER_MAJ) + +####### Files + +HEADERS = settings.h +SOURCES = light.cpp \ + main.cpp +OBJECTS = light.o \ + main.o \ + lightsettingsbase.o +INTERFACES = lightsettingsbase.ui +UICDECLS = lightsettingsbase.h +UICIMPLS = lightsettingsbase.cpp +SRCMOC = moc_settings.cpp \ + moc_lightsettingsbase.cpp +OBJMOC = moc_settings.o \ + moc_lightsettingsbase.o + + +####### Implicit rules + +.SUFFIXES: .cpp .cxx .cc .C .c + +.cpp.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.cxx.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.cc.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.C.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.c.o: + $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< + +####### Build rules + + +all: $(DESTDIR)$(TARGET) + +$(DESTDIR)$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS) + $(SYSCONF_LINK) $(LFLAGS) -o $(DESTDIR)$(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) + +moc: $(SRCMOC) + +tmake: + tmake light-and-power.pro + +clean: + -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) + -rm -f *~ core + -rm -f allmoc.cpp + +####### Extension Modules + +listpromodules: + @echo + +listallmodules: + @echo + +listaddonpromodules: + @echo + +listaddonentmodules: + @echo + + +REQUIRES= + +####### Sub-libraries + + +###### Combined headers + + + +####### Compile + +light.o: light.cpp \ + settings.h \ + lightsettingsbase.h + +main.o: main.cpp \ + settings.h \ + lightsettingsbase.h + +lightsettingsbase.h: lightsettingsbase.ui + $(UIC) lightsettingsbase.ui -o $(INTERFACE_DECL_PATH)/lightsettingsbase.h + +lightsettingsbase.cpp: lightsettingsbase.ui + $(UIC) lightsettingsbase.ui -i lightsettingsbase.h -o lightsettingsbase.cpp + +lightsettingsbase.o: lightsettingsbase.cpp \ + lightsettingsbase.h \ + lightsettingsbase.ui + +moc_settings.o: moc_settings.cpp \ + settings.h \ + lightsettingsbase.h + +moc_lightsettingsbase.o: moc_lightsettingsbase.cpp \ + lightsettingsbase.h + +moc_settings.cpp: settings.h + $(MOC) settings.h -o moc_settings.cpp + +moc_lightsettingsbase.cpp: lightsettingsbase.h + $(MOC) lightsettingsbase.h -o moc_lightsettingsbase.cpp + + diff --git a/core/settings/light-and-power/light-and-power.pro b/core/settings/light-and-power/light-and-power.pro new file mode 100644 index 0000000..87bb111 --- a/dev/null +++ b/core/settings/light-and-power/light-and-power.pro @@ -0,0 +1,12 @@ +TEMPLATE = app +CONFIG += qt warn_on release +DESTDIR = ../../bin +HEADERS = settings.h +SOURCES = light.cpp main.cpp +INTERFACES = lightsettingsbase.ui +INCLUDEPATH += $(QPEDIR)/include +DEPENDPATH += ../$(QPEDIR)/include +LIBS += -lqpe +TARGET = light-and-power + +TRANSLATIONS = ../../i18n/de/light-and-power.ts diff --git a/core/settings/light-and-power/light-off.xpm b/core/settings/light-and-power/light-off.xpm new file mode 100644 index 0000000..26624c7 --- a/dev/null +++ b/core/settings/light-and-power/light-off.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static char * light_off_xpm[] = { +"16 16 4 1", +" c None", +". c #000000000000", +"X c #6B6B6C6C6C6C", +"o c #FFFF6C6C0000", +" ", +" ", +" ... ", +" . . ", +" . X. ", +" . X. ", +" . XXX. ", +" . X XX. ", +" . XX. ", +" . XXX. ", +" . X. ", +" . X.. ", +" .ooo.. ", +" .ooo.. ", +" .o.. ", +" .. "}; diff --git a/core/settings/light-and-power/light-on.xpm b/core/settings/light-and-power/light-on.xpm new file mode 100644 index 0000000..3f8e174 --- a/dev/null +++ b/core/settings/light-and-power/light-on.xpm @@ -0,0 +1,24 @@ +/* XPM */ +static char * light_on_xpm[] = { +"16 16 5 1", +" c None", +". c #FFFFFFFF0000", +"X c #000000000000", +"o c #FFFFFFFFFFFF", +"O c #FFFF6C6C0000", +" . . ", +" . . . ", +" . XXX . ", +" XoooX . ", +" Xoooo.X ", +" .. Xoooooo.X ", +" Xoooo...X ..", +" Xooo.o..X ", +" .. Xooo..X ", +" Xoo...X ", +" . Xoo.X . ", +" . Xoo.XX . ", +" XOOOXX ", +" XOOOXX ", +" XOXX ", +" XX "}; diff --git a/core/settings/light-and-power/light.cpp b/core/settings/light-and-power/light.cpp new file mode 100644 index 0000000..24e1fab --- a/dev/null +++ b/core/settings/light-and-power/light.cpp @@ -0,0 +1,133 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#include "settings.h" + +#include <qpe/global.h> +#include <qpe/fontmanager.h> +#include <qpe/config.h> +#include <qpe/applnk.h> +#include <qpe/qpeapplication.h> +#if defined(Q_WS_QWS) && !defined(QT_NO_COP) +#include <qpe/qcopenvelope_qws.h> +#endif + +#include <qlabel.h> +#include <qcheckbox.h> +#include <qradiobutton.h> +#include <qtabwidget.h> +#include <qslider.h> +#include <qfile.h> +#include <qtextstream.h> +#include <qdatastream.h> +#include <qmessagebox.h> +#include <qcombobox.h> +#include <qspinbox.h> +#include <qlistbox.h> +#include <qdir.h> +#if QT_VERSION >= 300 +#include <qstylefactory.h> +#endif + +extern int qpe_sysBrightnessSteps(); + +LightSettings::LightSettings( QWidget* parent, const char* name, WFlags fl ) + : LightSettingsBase( parent, name, TRUE, fl ) +{ + // Not supported + auto_brightness->hide(); + + Config config( "qpe" ); + + config.setGroup( "Screensaver" ); + + int interval; + interval = config.readNumEntry( "Interval_Dim", 30 ); + interval_dim->setValue( interval ); + interval = config.readNumEntry( "Interval_LightOff", 20 ); + interval_lightoff->setValue( interval ); + interval = config.readNumEntry( "Interval", 60 ); + if ( interval > 3600 ) interval /= 1000; // compatibility (was millisecs) + interval_suspend->setValue( interval ); + + screensaver_dim->setChecked( config.readNumEntry("Dim",1) != 0 ); + screensaver_lightoff->setChecked( config.readNumEntry("LightOff",1) != 0 ); + int maxbright = qpe_sysBrightnessSteps(); + initbright = config.readNumEntry("Brightness",255); + brightness->setMaxValue( maxbright ); + brightness->setTickInterval( QMAX(1,maxbright/16) ); + brightness->setLineStep( QMAX(1,maxbright/16) ); + brightness->setPageStep( QMAX(1,maxbright/16) ); + brightness->setValue( (maxbright*255 - initbright*maxbright)/255 ); + + connect(brightness, SIGNAL(valueChanged(int)), this, SLOT(applyBrightness())); +} + +LightSettings::~LightSettings() +{ +} + +static void set_fl(int bright) +{ + QCopEnvelope e("QPE/System", "setBacklight(int)" ); + e << bright; +} + +void LightSettings::reject() +{ + set_fl(initbright); + + QDialog::reject(); +} + +void LightSettings::accept() +{ + if ( qApp->focusWidget() ) + qApp->focusWidget()->clearFocus(); + + applyBrightness(); + + int i_dim = (screensaver_dim->isChecked() ? interval_dim->value() : 0); + int i_lightoff = (screensaver_lightoff->isChecked() ? interval_lightoff->value() : 0); + int i_suspend = interval_suspend->value(); + QCopEnvelope e("QPE/System", "setScreenSaverIntervals(int,int,int)" ); + e << i_dim << i_lightoff << i_suspend; + + Config config( "qpe" ); + config.setGroup( "Screensaver" ); + config.writeEntry( "Dim", (int)screensaver_dim->isChecked() ); + config.writeEntry( "LightOff", (int)screensaver_lightoff->isChecked() ); + config.writeEntry( "Interval_Dim", interval_dim->value() ); + config.writeEntry( "Interval_LightOff", interval_lightoff->value() ); + config.writeEntry( "Interval", interval_suspend->value() ); + config.writeEntry( "Brightness", + (brightness->maxValue()-brightness->value())*255/brightness->maxValue() ); + config.write(); + + QDialog::accept(); +} + +void LightSettings::applyBrightness() +{ + int bright = (brightness->maxValue()-brightness->value())*255 + / brightness->maxValue(); + set_fl(bright); +} + + diff --git a/core/settings/light-and-power/lightsettingsbase.ui b/core/settings/light-and-power/lightsettingsbase.ui new file mode 100644 index 0000000..47775f7 --- a/dev/null +++ b/core/settings/light-and-power/lightsettingsbase.ui @@ -0,0 +1,471 @@ +<!DOCTYPE UI><UI> +<class>LightSettingsBase</class> +<widget> + <class>QDialog</class> + <property stdset="1"> + <name>name</name> + <cstring>LightSettingsBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>256</width> + <height>316</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Light Settings</string> + </property> + <property> + <name>layoutMargin</name> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>7</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>auto_brightness</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Adjust to environment</string> + </property> + <property> + <name>whatsThis</name> + <string>By sensing the ambient light where you are using your device, the screen light can be adjusted automatically. The brightness setting still affects the average brightness.</string> + </property> + </widget> + <widget> + <class>QGroupBox</class> + <property stdset="1"> + <name>name</name> + <cstring>GroupBox3</cstring> + </property> + <property stdset="1"> + <name>title</name> + <string>Power saving</string> + </property> + <property> + <name>layoutMargin</name> + </property> + <property> + <name>layoutSpacing</name> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>6</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>3</number> + </property> + <widget row="1" column="1" > + <class>QSpinBox</class> + <property stdset="1"> + <name>name</name> + <cstring>interval_lightoff</cstring> + </property> + <property stdset="1"> + <name>suffix</name> + <string> seconds</string> + </property> + <property stdset="1"> + <name>buttonSymbols</name> + <enum>PlusMinus</enum> + </property> + <property stdset="1"> + <name>maxValue</name> + <number>3600</number> + </property> + <property stdset="1"> + <name>minValue</name> + <number>10</number> + </property> + <property stdset="1"> + <name>lineStep</name> + <number>15</number> + </property> + </widget> + <widget row="2" column="1" > + <class>QSpinBox</class> + <property stdset="1"> + <name>name</name> + <cstring>interval_suspend</cstring> + </property> + <property stdset="1"> + <name>suffix</name> + <string> seconds</string> + </property> + <property stdset="1"> + <name>buttonSymbols</name> + <enum>PlusMinus</enum> + </property> + <property stdset="1"> + <name>maxValue</name> + <number>3600</number> + </property> + <property stdset="1"> + <name>minValue</name> + <number>10</number> + </property> + <property stdset="1"> + <name>lineStep</name> + <number>15</number> + </property> + </widget> + <widget row="1" column="0" > + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>screensaver_lightoff</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>Light off after</string> + </property> + <property stdset="1"> + <name>checked</name> + <bool>true</bool> + </property> + </widget> + <widget row="0" column="0" > + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>screensaver_dim</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>Dim light after</string> + </property> + <property stdset="1"> + <name>checked</name> + <bool>true</bool> + </property> + </widget> + <widget row="0" column="1" > + <class>QSpinBox</class> + <property stdset="1"> + <name>name</name> + <cstring>interval_dim</cstring> + </property> + <property stdset="1"> + <name>suffix</name> + <string> seconds</string> + </property> + <property stdset="1"> + <name>buttonSymbols</name> + <enum>PlusMinus</enum> + </property> + <property stdset="1"> + <name>maxValue</name> + <number>3600</number> + </property> + <property stdset="1"> + <name>minValue</name> + <number>10</number> + </property> + <property stdset="1"> + <name>lineStep</name> + <number>15</number> + </property> + </widget> + <widget row="2" column="0" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel1_2</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Suspend after</string> + </property> + </widget> + </grid> + </widget> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout18</cstring> + </property> + <property> + <name>layoutMargin</name> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QSlider</class> + <property stdset="1"> + <name>name</name> + <cstring>brightness</cstring> + </property> + <property stdset="1"> + <name>maxValue</name> + <number>255</number> + </property> + <property stdset="1"> + <name>lineStep</name> + <number>16</number> + </property> + <property stdset="1"> + <name>pageStep</name> + <number>16</number> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Vertical</enum> + </property> + <property stdset="1"> + <name>tickmarks</name> + <enum>Right</enum> + </property> + <property stdset="1"> + <name>tickInterval</name> + <number>32</number> + </property> + </widget> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout16</cstring> + </property> + <property> + <name>layoutSpacing</name> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>0</number> + </property> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout10</cstring> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>PixmapLabel1</cstring> + </property> + <property stdset="1"> + <name>pixmap</name> + <pixmap>image0</pixmap> + </property> + <property stdset="1"> + <name>scaledContents</name> + <bool>false</bool> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel1</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Bright</string> + </property> + </widget> + <spacer> + <property> + <name>name</name> + <cstring>Spacer3</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Horizontal</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel3</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>7</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string><blockquote>The brighter the screen light, the more battery power is used.</blockquote></string> + </property> + </widget> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout9</cstring> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>PixmapLabel2</cstring> + </property> + <property stdset="1"> + <name>pixmap</name> + <pixmap>image1</pixmap> + </property> + <property stdset="1"> + <name>scaledContents</name> + <bool>false</bool> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel2</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Off</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignVCenter|AlignLeft</set> + </property> + <property> + <name>vAlign</name> + </property> + </widget> + <spacer> + <property> + <name>name</name> + <cstring>Spacer2</cstring> + </property> + <property stdset="1"> + <name>orientation</name> + <enum>Horizontal</enum> + </property> + <property stdset="1"> + <name>sizeType</name> + <enum>Expanding</enum> + </property> + <property> + <name>sizeHint</name> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<images> + <image> + <name>image0</name> + <data format="XPM.GZ" length="439">789c6d8ec10ac2300c86ef7b8ad0ff36a4730777111f41f1288887b4b3e8610a3a0f22bebb6dd3d54d0ca5cdffe54f9aaaa4dd764d6555dc7beecf96ec896f54b68fae7bee0fab57a1ea86fc5950ad6685d2646973bd1c43ce3ec73c46903648e79a5624443a27d20cd2b9382704747e124382f11a7c5e30b364b957b331866331b3800c38f70282121c7c628367c098c1e0eb03121ccd4b46fcb0f80b26bb4833987f76b6d6f274de5fe6a1a031d30969f55e161fe4715f7b</data> + </image> + <image> + <name>image1</name> + <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103711c4354b344b314b04719340dcb434b31488ac1e1a2020a6acac8c2ea60cc54862606ea232b218541b5810452c3111432c510f550c22886a1e482c115d0c2c88e6168818babaa4a42462c48082cae8e68102011a06b5d65c0041d3518e</data> + </image> +</images> +<connections> + <connection> + <sender>screensaver_dim</sender> + <signal>toggled(bool)</signal> + <receiver>interval_dim</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>screensaver_lightoff</sender> + <signal>toggled(bool)</signal> + <receiver>interval_lightoff</receiver> + <slot>setEnabled(bool)</slot> + </connection> +</connections> +<tabstops> + <tabstop>auto_brightness</tabstop> + <tabstop>screensaver_dim</tabstop> + <tabstop>interval_dim</tabstop> + <tabstop>screensaver_lightoff</tabstop> + <tabstop>interval_lightoff</tabstop> + <tabstop>interval_suspend</tabstop> + <tabstop>brightness</tabstop> +</tabstops> +</UI> diff --git a/core/settings/light-and-power/main.cpp b/core/settings/light-and-power/main.cpp new file mode 100644 index 0000000..051fdec --- a/dev/null +++ b/core/settings/light-and-power/main.cpp @@ -0,0 +1,38 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "settings.h" + +#include <qpe/qpeapplication.h> +#include <qpe/qcopenvelope_qws.h> +#include <qpe/global.h> + + +int main(int argc, char** argv) +{ + QPEApplication a(argc,argv); + + LightSettings dlg; + + a.showMainWidget(&dlg); + + return a.exec(); +} + diff --git a/core/settings/light-and-power/qpe-light-and-power.control b/core/settings/light-and-power/qpe-light-and-power.control new file mode 100644 index 0000000..0ed9d84 --- a/dev/null +++ b/core/settings/light-and-power/qpe-light-and-power.control @@ -0,0 +1,9 @@ +Files: bin/light-and-power apps/Settings/Light.desktop +Priority: optional +Section: qpe/settings +Maintainer: Warwick Allison <warwick@trolltech.com> +Architecture: arm +Version: $QPE_VERSION-3 +Depends: qpe-base ($QPE_VERSION) +Description: Light and Power settings dialog + For the Qtopia environment. diff --git a/core/settings/light-and-power/settings.h b/core/settings/light-and-power/settings.h new file mode 100644 index 0000000..cec08e3 --- a/dev/null +++ b/core/settings/light-and-power/settings.h @@ -0,0 +1,50 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef SETTINGS_H +#define SETTINGS_H + + +#include <qstrlist.h> +#include <qasciidict.h> +#include "lightsettingsbase.h" + + +class LightSettings : public LightSettingsBase +{ + Q_OBJECT + +public: + LightSettings( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~LightSettings(); + +protected: + void accept(); + void reject(); + +private slots: + void applyBrightness(); + +private: + int initbright; +}; + + +#endif // SETTINGS_H + diff --git a/core/settings/security/.cvsignore b/core/settings/security/.cvsignore new file mode 100644 index 0000000..11eef0d --- a/dev/null +++ b/core/settings/security/.cvsignore @@ -0,0 +1,5 @@ +Makefile +moc_* +*.moc +securitybase.cpp +securitybase.h diff --git a/core/settings/security/Makefile.in b/core/settings/security/Makefile.in new file mode 100644 index 0000000..803edc5 --- a/dev/null +++ b/core/settings/security/Makefile.in @@ -0,0 +1,135 @@ +############################################################################# + +####### Compiler, tools and options + +CXX = $(SYSCONF_CXX) $(QT_CXX_MT) +CXXFLAGS= $(SYSCONF_CXXFLAGS_QT) $(SYSCONF_CXXFLAGS) +CC = $(SYSCONF_CC) $(QT_C_MT) +CFLAGS = $(SYSCONF_CFLAGS) +INCPATH = -I$(QPEDIR)/include +LFLAGS = $(SYSCONF_LFLAGS_QT) $(SYSCONF_RPATH_QT) $(SYSCONF_LFLAGS) $(QT_LFLAGS_MT) +LIBS = $(SUBLIBS) -lqpe $(SYSCONF_LIBS_QT) $(SYSCONF_LIBS) $(SYSCONF_LIBS_QTAPP) +MOC = $(SYSCONF_MOC) +UIC = $(SYSCONF_UIC) + +####### Target + +DESTDIR = ../../bin/ +VER_MAJ = 1 +VER_MIN = 0 +VER_PATCH = 0 +TARGET = security +TARGET1 = lib$(TARGET).so.$(VER_MAJ) + +####### Files + +HEADERS = security.h +SOURCES = security.cpp \ + main.cpp +OBJECTS = security.o \ + main.o \ + securitybase.o +INTERFACES = securitybase.ui +UICDECLS = securitybase.h +UICIMPLS = securitybase.cpp +SRCMOC = moc_security.cpp \ + moc_securitybase.cpp +OBJMOC = moc_security.o \ + moc_securitybase.o + + +####### Implicit rules + +.SUFFIXES: .cpp .cxx .cc .C .c + +.cpp.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.cxx.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.cc.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.C.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.c.o: + $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< + +####### Build rules + + +all: $(DESTDIR)$(TARGET) + +$(DESTDIR)$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS) + $(SYSCONF_LINK) $(LFLAGS) -o $(DESTDIR)$(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) + +moc: $(SRCMOC) + +tmake: + tmake security.pro + +clean: + -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) + -rm -f *~ core + -rm -f allmoc.cpp + +####### Extension Modules + +listpromodules: + @echo + +listallmodules: + @echo + +listaddonpromodules: + @echo + +listaddonentmodules: + @echo + + +REQUIRES= + +####### Sub-libraries + + +###### Combined headers + + + +####### Compile + +security.o: security.cpp \ + security.h \ + securitybase.h + +main.o: main.cpp \ + security.h \ + securitybase.h + +securitybase.h: securitybase.ui + $(UIC) securitybase.ui -o $(INTERFACE_DECL_PATH)/securitybase.h + +securitybase.cpp: securitybase.ui + $(UIC) securitybase.ui -i securitybase.h -o securitybase.cpp + +securitybase.o: securitybase.cpp \ + securitybase.h \ + securitybase.ui + +moc_security.o: moc_security.cpp \ + security.h \ + securitybase.h + +moc_securitybase.o: moc_securitybase.cpp \ + securitybase.h + +moc_security.cpp: security.h + $(MOC) security.h -o moc_security.cpp + +moc_securitybase.cpp: securitybase.h + $(MOC) securitybase.h -o moc_securitybase.cpp + + diff --git a/core/settings/security/main.cpp b/core/settings/security/main.cpp new file mode 100644 index 0000000..c15bb31 --- a/dev/null +++ b/core/settings/security/main.cpp @@ -0,0 +1,38 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include <qpe/qpeapplication.h> +#include <qpe/qcopenvelope_qws.h> +#include <qpe/global.h> + +#include "security.h" + + +int main(int argc, char** argv) +{ + QPEApplication a(argc,argv); + + Security dlg; + + a.showMainWidget(&dlg); + + return a.exec(); +} + diff --git a/core/settings/security/qpe-security.control b/core/settings/security/qpe-security.control new file mode 100644 index 0000000..78a5a86 --- a/dev/null +++ b/core/settings/security/qpe-security.control @@ -0,0 +1,9 @@ +Files: bin/security apps/Settings/Security.desktop +Priority: optional +Section: qpe/settings +Maintainer: Warwick Allison <warwick@trolltech.com> +Architecture: arm +Version: $QPE_VERSION-3 +Depends: qpe-base ($QPE_VERSION) +Description: Security settings dialog + For the Qtopia environment. diff --git a/core/settings/security/security.cpp b/core/settings/security/security.cpp new file mode 100644 index 0000000..f4116b0 --- a/dev/null +++ b/core/settings/security/security.cpp @@ -0,0 +1,234 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#include "security.h" + +#include <qpe/config.h> +#include <qpe/password.h> +#include <qpe/qpedialog.h> + +#include <qcheckbox.h> +#include <qpushbutton.h> +#include <qcombobox.h> +#include <qmessagebox.h> + +Security::Security( QWidget* parent, const char* name, WFlags fl ) + : SecurityBase( parent, name, TRUE, fl ) +{ + valid=FALSE; + Config cfg("Security"); + cfg.setGroup("Passcode"); + passcode = cfg.readEntry("passcode"); + passcode_poweron->setChecked(cfg.readBoolEntry("passcode_poweron",FALSE)); + cfg.setGroup("Sync"); + int auth_peer = cfg.readNumEntry("auth_peer",0xc0a80100); + int auth_peer_bits = cfg.readNumEntry("auth_peer_bits",24); + selectNet(auth_peer,auth_peer_bits); + connect(syncnet, SIGNAL(textChanged(const QString&)), + this, SLOT(setSyncNet(const QString&))); + + /* + cfg.setGroup("Remote"); + if ( telnetAvailable() ) + telnet->setChecked(cfg.readEntry("allow_telnet")); + else + telnet->hide(); + + if ( sshAvailable() ) + ssh->setChecked(cfg.readEntry("allow_ssh")); + else + ssh->hide(); + */ + + connect(changepasscode,SIGNAL(clicked()), this, SLOT(changePassCode())); + connect(clearpasscode,SIGNAL(clicked()), this, SLOT(clearPassCode())); + updateGUI(); + + dl = new QPEDialogListener(this); +} + +Security::~Security() +{ +} + + +void Security::updateGUI() +{ + bool empty = passcode.isEmpty(); + + changepasscode->setText( empty ? tr("Set passcode" ) + : tr("Change passcode" ) ); + passcode_poweron->setEnabled( !empty ); + clearpasscode->setEnabled( !empty ); +} + + +void Security::show() +{ + valid=FALSE; + setEnabled(FALSE); + SecurityBase::show(); + if ( passcode.isEmpty() ) { + // could insist... + //changePassCode(); + //if ( passcode.isEmpty() ) + //reject(); + } else { + QString pc = enterPassCode(tr("Enter passcode")); + if ( pc != passcode ) { + QMessageBox::critical(this, tr("Passcode incorrect"), + tr("The passcode entered is incorrect.\nAccess denied")); + reject(); + return; + } + } + setEnabled(TRUE); + valid=TRUE; +} + +void Security::accept() +{ + applySecurity(); + QDialog::accept(); +} + +void Security::done(int r) +{ + QDialog::done(r); + close(); +} + +void Security::selectNet(int auth_peer,int auth_peer_bits) +{ + QString sn; + if ( auth_peer_bits == 0 && auth_peer == 0 ) { + sn = tr("Any"); + } else if ( auth_peer_bits == 32 && auth_peer == 0 ) { + sn = tr("None"); + } else { + sn = + QString::number((auth_peer>>24)&0xff) + "." + + QString::number((auth_peer>>16)&0xff) + "." + + QString::number((auth_peer>>8)&0xff) + "." + + QString::number((auth_peer>>0)&0xff) + "/" + + QString::number(auth_peer_bits); + } + for (int i=0; i<syncnet->count(); i++) { + if ( syncnet->text(i).left(sn.length()) == sn ) { + syncnet->setCurrentItem(i); + return; + } + } + qDebug("No match for \"%s\"",sn.latin1()); +} + +void Security::parseNet(const QString& sn,int& auth_peer,int& auth_peer_bits) +{ + auth_peer=0; + if ( sn == tr("Any") ) { + auth_peer = 0; + auth_peer_bits = 0; + } else if ( sn == tr("None") ) { + auth_peer = 0; + auth_peer_bits = 32; + } else { + int x=0; + for (int i=0; i<4; i++) { + int nx = sn.find(QChar(i==3 ? '/' : '.'),x); + auth_peer = (auth_peer<<8)|sn.mid(x,nx-x).toInt(); + x = nx+1; + } + uint n = (uint)sn.find(' ',x)-x; + auth_peer_bits = sn.mid(x,n).toInt(); + } +} + +void Security::setSyncNet(const QString& sn) +{ + int auth_peer,auth_peer_bits; + parseNet(sn,auth_peer,auth_peer_bits); + selectNet(auth_peer,auth_peer_bits); +} + +void Security::applySecurity() +{ + if ( valid ) { + Config cfg("Security"); + cfg.setGroup("Passcode"); + cfg.writeEntry("passcode",passcode); + cfg.writeEntry("passcode_poweron",passcode_poweron->isChecked()); + cfg.setGroup("Sync"); + int auth_peer=0; + int auth_peer_bits; + QString sn = syncnet->currentText(); + parseNet(sn,auth_peer,auth_peer_bits); + cfg.writeEntry("auth_peer",auth_peer); + cfg.writeEntry("auth_peer_bits",auth_peer_bits); + /* + cfg.setGroup("Remote"); + if ( telnetAvailable() ) + cfg.writeEntry("allow_telnet",telnet->isChecked()); + if ( sshAvailable() ) + cfg.writeEntry("allow_ssh",ssh->isChecked()); + // ### write ssh/telnet sys config files + */ + } +} + +void Security::changePassCode() +{ + QString new1; + QString new2; + + do { + new1 = enterPassCode("Enter new passcode"); + if ( new1.isNull() ) + return; + new2 = enterPassCode("Re-enter new passcode"); + if ( new2.isNull() ) + return; + } while (new1 != new2); + + passcode = new1; + updateGUI(); +} + +void Security::clearPassCode() +{ + passcode = QString::null; + updateGUI(); +} + + +QString Security::enterPassCode(const QString& prompt) +{ + return Password::getPassword(prompt); +} + +bool Security::telnetAvailable() const +{ + // ### not implemented + return FALSE; +} + +bool Security::sshAvailable() const +{ + // ### not implemented + return FALSE; +} diff --git a/core/settings/security/security.h b/core/settings/security/security.h new file mode 100644 index 0000000..efc83a2 --- a/dev/null +++ b/core/settings/security/security.h @@ -0,0 +1,64 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef SECURITY_H +#define SECURITY_H + +#include "securitybase.h" + +class QPEDialogListener; + +class Security : public SecurityBase +{ + Q_OBJECT + +public: + Security( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~Security(); + + void show(); + +protected: + void accept(); + void applySecurity(); + void done(int); + +private slots: + void changePassCode(); + void clearPassCode(); + void setSyncNet(const QString&); + +private: + bool telnetAvailable() const; + bool sshAvailable() const; + void updateGUI(); + + static void parseNet(const QString& sn,int& auth_peer,int& auth_peer_bits); + void selectNet(int auth_peer,int auth_peer_bits); + + QString enterPassCode(const QString&); + QString passcode; + bool valid; + + QPEDialogListener *dl; +}; + + +#endif // SECURITY_H + diff --git a/core/settings/security/security.pro b/core/settings/security/security.pro new file mode 100644 index 0000000..282127e --- a/dev/null +++ b/core/settings/security/security.pro @@ -0,0 +1,12 @@ +TEMPLATE = app +CONFIG += qt warn_on release +DESTDIR = ../../bin +HEADERS = security.h +SOURCES = security.cpp main.cpp +INTERFACES = securitybase.ui +INCLUDEPATH += $(QPEDIR)/include +DEPENDPATH += ../$(QPEDIR)/include +LIBS += -lqpe +TARGET = security + +TRANSLATIONS = ../../i18n/de/security.ts diff --git a/core/settings/security/securitybase.ui b/core/settings/security/securitybase.ui new file mode 100644 index 0000000..2f3189d --- a/dev/null +++ b/core/settings/security/securitybase.ui @@ -0,0 +1,200 @@ +<!DOCTYPE UI><UI> +<class>SecurityBase</class> +<widget> + <class>QDialog</class> + <property stdset="1"> + <name>name</name> + <cstring>SecurityBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>281</width> + <height>328</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Security Settings</string> + </property> + <property> + <name>layoutMargin</name> + </property> + <grid> + <property stdset="1"> + <name>margin</name> + <number>11</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget row="0" column="0" > + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout1</cstring> + </property> + <property> + <name>layoutSpacing</name> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>-1</number> + </property> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>changepasscode</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Change passcode</string> + </property> + </widget> + <widget> + <class>QPushButton</class> + <property stdset="1"> + <name>name</name> + <cstring>clearpasscode</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Clear passcode</string> + </property> + </widget> + </hbox> + </widget> + <widget row="1" column="0" > + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>passcode_poweron</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Require pass code at power-on</string> + </property> + </widget> + <widget row="3" column="0" > + <class>QTabWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>TabWidget2</cstring> + </property> + <widget> + <class>QWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>tab</cstring> + </property> + <attribute> + <name>title</name> + <string>Sync</string> + </attribute> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>11</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel1_2</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Accept sync from network:</string> + </property> + </widget> + <widget> + <class>QComboBox</class> + <item> + <property> + <name>text</name> + <string>192.168.1.0/24 (default)</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>192.168.0.0/16</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>172.16.0.0/12</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>10.0.0.0/8</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>Any</string> + </property> + </item> + <item> + <property> + <name>text</name> + <string>None</string> + </property> + </item> + <property stdset="1"> + <name>name</name> + <cstring>syncnet</cstring> + </property> + <property stdset="1"> + <name>editable</name> + <bool>true</bool> + </property> + </widget> + </vbox> + </widget> + </widget> + <widget row="2" column="0" > + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>TextLabel1</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>7</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string><P>Pass code protection provides a minimal level of protection from casual access to this device.</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignTop|AlignLeft</set> + </property> + <property> + <name>vAlign</name> + </property> + </widget> + </grid> +</widget> +</UI> |